2017-02-10 15 views
0

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

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

ответ

2

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

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

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

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

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

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

+0

Wow - это очень много - я пойду через них всех. Благодарю. Я знаю, что в кодексе есть некоторые недостатки, которые не связаны с обещаниями, но это в основном указать, что я пытался. Оригинальный фрагмент кода немного лучше и совсем другой (это всего лишь пример). – Torf