Использование обещаний в 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
затем используйте один из следующих модулей:
- https://www.npmjs.com/package/mz
- http://bluebirdjs.com/docs/api/promise.promisifyall.html
- https://www.npmjs.com/package/fs-promise
- https://www.npmjs.com/package/fs-promised
Также не используйте глобальные переменные для всего, потому что у вас будут проблемы с любым параллелизмом.
Также читайте об обещаниях. Без понимания того, как работают обещания, вы не сможете угадать правильный способ их использования. Даже просмотр некоторых примеров рабочего кода может помочь, и в стеке много вопросов и ответов. Переполнение обещаний:
- обещание позвонить отдельно от обещания-разрешения
- Q Задержка обещания
- Вернуть результат Promise вместо Promise
- Экспорт модуля из обещанного результата
- Что плохого в разрешении обещаний?
- Возвращаемое значение в функции из блока обещаний
- Как я могу вернуть статус внутри обещания?
- Должен ли я воздерживаться от асинхронной обработки отклонения Promise?
- Является ли концепция отложенного / обещанного в JavaScript новой или это традиционная часть функционального программирования?
- Как я могу связать эти функции вместе с обещаниями?
- Promise.all в JavaScript: Как получить значение разрешения для всех обещаний?
- Почему Promise.all не определен
- функция будет возвращать ноль из javascript post/get
- Используйте cancel() внутри цепочки then, созданной promisifyAll
- Почему в Promise.then() можно передать нефункциональный параметр, не вызывая ошибки?
- Реализовать шаблон обещаний
- Обещания и производительность
- Проблема соскоба двух URL с обещаниями
- http.request не возвращает данные даже после указания возврата в событии 'end'
- async.each не повторяется при использовании обещаний
- jQuery jqXHR - отмена связанных вызовов, запуск цепочки ошибок
- Правильный способ обработки посылок и ответа сервера
- Вернуть значение из вызова функции перед завершением всех операций внутри самой функции?
- Разрешение setTimeout внутри конечной точки API
- Асинхронное ожидание функции
- Функция JavaScript, которая возвращает данные вызова AJAX
- попробуйте / поймать блоки с асинхронным / ожиданием
- jQuery Отложено не вызывать обратные вызовы resol /done по порядку
- Возвращение данных из AJAX приводит к странному объекту
- Почему есть спецификация для синхронизации и асинхронных модулей?
- Возврат данных после успешного вызова AJAX