async.each не повторяется при использовании обещаний

Я пытаюсь запустить асинхронный цикл 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();
        })
    })
})

2 ответа

Вы используете только .then() обратные вызовы, чтобы вы справились с успехом.

Но вы также должны добавить .catch() обратные вызовы для обработки ошибок.

Скорее всего, вы получаете ошибки, которые не обрабатываются и ничего не происходит.

Например:

            // ...
        }).then( function(result) {
            console.log("here");
            callback();
        }).catch(function (error) {
            console.log('Error:', error);
            callback(error);
        });

Оказывается, что я сделал ошибку в функции 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.

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