Используя promises в node.js для создания и сравнения двух массивов

Мне нужно было сравнить два массива, первый из которых - пару имен файлов из базы данных, второй - список файлов, которые я уже загрузил на свой клиент. Идея заключалась в загрузке любых файлов, отсутствующих на клиенте. Поскольку чтение через fs было два медленных, я попытался использовать Promises, чтобы дождаться завершения одной функции до следующего запуска. Но почему-то я потерялся... Мой код:

let filesIneed = [];
let filesIhave = [];
let filesToFetch = [];
getLocalFiles().then(getFilesIneed).then(getfilesToRetreive);

function getLocalFiles() {
    fs.readdir(localPath, (err, files) => {
        files.forEach(file => {
                filesIhave.push(file)
        });
    })
    return Promise.all(filesIhave);
}

function getFilesIneed () {
    for (let x of docs) {//this is my JSON
        filesIneed.push(y.NameOfFileIShouldHave);
        }
    }
    return Promise.all(filesIneed);
}

function getfilesToRetreive() {
    filesToFetch = _.difference(filesIneed, filesIhave);
    return Promise.all(filesToFetch);
}


console.log(filesToFetch);

Я получаю первый и второй массив ( "filesIneed" и "filesIhave" ), но разница всегда пуста. Так что, может быть, я просто искалечил Promises, так как эта концепция для меня совершенно новая, и я знаю, что понимаю ее только половину.

Ответ 1

Это совершенно неправильно. Вы не можете запустить Promise.all по массиву имен файлов. Вы можете запускать его только в массиве promises.

Также нет необходимости толкать каждый элемент массива по одному в пустой массив, чтобы вернуть этот массив, когда у вас уже есть этот массив.

Вы не можете использовать promises для сравнения двух массивов. Вы можете использовать lodash для сравнения двух массивов в обработчике then обещания, который разрешает массив.

Если вы хотите получить обещание имен файлов из fs.readdir, используйте один из следующих модулей:

Также не используйте глобальные переменные для всего, потому что у вас будут проблемы с любым concurrency.

Кроме того, читайте о promises. Не понимая, как работает promises, вы не сможете угадать правильный способ их использования. Даже просмотр некоторых примеров рабочих кодов может многое помочь, и есть много вопросов и ответов о переполнении стека около promises: