【问题标题】:async.each not iterating when using promisesasync.each 在使用 Promise 时不迭代
【发布时间】:2017-05-24 20:31:48
【问题描述】:

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

【问题讨论】:

  • 您可以尝试调用捕获err 的可选回调吗?

标签: javascript node.js asynchronous async.js


【解决方案1】:

原来我在 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 的帮助。

【讨论】:

    【解决方案2】:

    您只使用.then() 回调来处理成功。

    但您还应该添加一些.catch() 回调来处理错误。

    您很可能会遇到未处理的错误并且什么也没有发生。

    例如:

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

    【讨论】:

      猜你喜欢
      • 2019-04-01
      • 2017-08-27
      • 1970-01-01
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2016-10-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多