async.each在使用promise时不会迭代

我试图在一个对象数组上运行异步循环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();
        })
    })
})

您只使用.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);
            });
        });
    });
}

把问题写出来帮助,让我知道是否应该删除问题。

感谢您的帮助Mukesh Sharma和rsp。

链接地址: http://www.djcxy.com/p/55379.html

上一篇: async.each not iterating when using promises

下一篇: NodeJS http.request not returning data even after specifying return on the 'end' event