Async.each не повторяется при использовании promises
Я пытаюсь запустить асинхронный цикл async.each
по массиву объектов.
На каждом объекте в массиве я пытаюсь выполнить две функции последовательно (используя promises
). Проблема в том, что async.each
работает только для первого ключевого слова.
В следующем коде getKeywords
загружает некоторые ключевые слова из файла, а затем возвращает массив объектов ключевого слова. Каждый объект ключевого слова помещается в searchKeyword
, который выполняет поиск. Результат поиска затем помещается в базу данных с помощью InsertSearchResults
.
На мой взгляд, каждое ключевое слово должно обрабатываться параллельно, а функции поиска и вставки связаны.
getKeywords(keys).then(function(keywords) {
async.each(keywords, function(keywordObject, callback) {
searchKeyword(keywordObject).then(function(searchResults) {
return insertSearchResults(searchResults, db, collections);
}).then(function(result) {
console.log("here");
callback();
})
})
})
Ответы
Ответ 1
Вы используете только обратные вызовы .then()
, чтобы обрабатывать успех.
Но вы также должны добавить некоторые обратные вызовы .catch()
для обработки ошибок.
Скорее всего, вы получаете ошибки, которые не обрабатываются, и ничего не происходит.
Например:
// ...
}).then( function(result) {
console.log("here");
callback();
}).catch(function (error) {
console.log('Error:', error);
callback(error);
});
Ответ 2
Оказывается, что я сделал ошибку в функции getKeywords.
Я читал из файла, а затем повторял каждую строку, используя цикл for и выталкивая результат в массив. Затем этот массив возвращался функцией.
async.each работал отлично, но только получал массив длиной 1 для повторения.
Я исправил эту проблему, изменив цикл for на цикл async.each
function getKeywords(keywordsFilename){
//get keywords from the file
return new Promise( function (resolve, reject) {
var keywords = [];
fs.readFile(keywordsFilename, function read(err, data) {
if (err) {
reject(err);
}
content = data.toString();
var lines = content.split("\n");
async.each(lines, function(line, callback) {
if (line[0] === "#" || line == "") {
callback();
}
else {
keywords.push(extractKeyword(line));
callback();
}
}, function (err) {
resolve(keywords);
});
});
});
}
Написание проблемы помогло, дайте мне знать, если я должен удалить вопрос.
Спасибо за вашу помощь Мукеш Шарма и rsp.