Использование обещаний в 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"), но разница всегда пуста. Так что, возможно, я только что испортил Обещания, так как эта концепция для меня совершенно новая, и я знаю, что понял только половину.

1 ответ

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

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

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

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

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

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

Другие вопросы по тегам