【问题标题】:Nodejs foreach loop break using promises resultNodejs foreach循环使用promises结果中断
【发布时间】:2017-12-20 13:30:32
【问题描述】:

我正在使用 lodash _.forEach 循环,在 _.forEach 循环中我使用多个 promise 并放入数组 promise。使用 sendEmailApi 方法我正在向用户发送电子邮件,我的要求是如果我想从外部 _.forEach 循环退出时遇到任何错误,不想处理所有承诺。 下面的代码编写但不工作,如果我在循环中间遇到任何错误,它正在处理整个 _.forEach 循环

_.forEach(result, function (value, index) {
    _.forEach(value, function (value1, index1) {
        if(!displayName)
            displayName = value1.displayname;
        productList += '"' + value1.productplannames + '",';
    });
    tempJsonStr = '{"email":"' + index + '","displayname":"' + displayName + '","productplannames":[' + _.trim(productList, ",") + ']}';
    console.log("tempJsonStr",tempJsonStr);
    productList ="";
    displayName="";
    promises.push(emailUtils.sendEmailApiProcess(JSON.parse(tempJsonStr),responsePayLoad,task,done).then(function () {
    }).catch(err => {
        console.log("errrrrrrrrr");
    return false;
    }))

});

Promise.all(promises).then(function () {
    console.log("All done");
});

【问题讨论】:

  • _.forEach() 循环在任何电子邮件请求完成之前完成。
  • 不要像这样构建自己的 JSON - 使用 JSON.stringify,了解 Promise 的工作原理,了解异步代码的流程 - 阅读 stackoverflow.com/questions/14220321/…
  • 你正在以一个非常奇怪的顺序初始化 productListdisplayName
  • @Bergi 你知道如何分配它
  • 那么你应该用var声明它们,并且你应该在附加到它们的循环之前初始化它们。

标签: javascript node.js foreach promise lodash


【解决方案1】:

由于 Promise 的异步行为,经典的 foreach 循环不会等到每个 Promise 解决/拒绝。因此,在每次迭代结束时,您无法确定 Promise 不再处于待处理状态。

bluebird 的 Promise 实现为此提供了一个简洁的函数:Promise.each,它将等到 Promise 解决/拒绝: http://bluebirdjs.com/docs/api/promise.each.html

【讨论】:

  • 你可以分享一些示例承诺我的代码的每个代码
  • 我想在收到一个承诺的任何拒绝后立即打破承诺,不想处理所有承诺
猜你喜欢
  • 2018-05-12
  • 1970-01-01
  • 2014-12-05
  • 2015-05-30
  • 1970-01-01
  • 1970-01-01
  • 2020-01-18
  • 2021-07-17
  • 2017-03-10
相关资源
最近更新 更多