【问题标题】:Sequentially Q.all promises nodejs [duplicate]依次 Q.all 承诺 nodejs [重复]
【发布时间】:2016-06-07 20:59:44
【问题描述】:

我尝试实现一个 promise 函数,在向外部 api 发出请求后,它会检查我的数据库中是否存在对象,在否定的情况下,它会保存它。我将此函数与传入 Q.all 的数组一起使用,我看到所有对象都同时保存,因此每次检查都失败并且我有重复的对象。如何按顺序而不是并行运行 Q.all 中传递的承诺? 代码如下:finalCuts 是一个对象数组,与客户有关联。

request.findNewCustomer().then(function(customers) {
    Q.all(finalCuts.map(function(currFinalCut) {
        return checkAndSetCustomer(currFinalCut._id,currFinalCut.customerCod,customers)
     }));
});

checkAndSetCustomer = function(cutId,cod,customers) {
     var deferred = Q.defer();
     Customer.findByIdentity(cod).then(function(customer) {
         if (customer && customer.cod == cod) {
               Cut.addCustomerToCut(customer._id,cutId).then(function(result) {
                deferred.resolve(result);
            });
         } else {
            customers.forEach(function(currCustomer) {
                 if (currCustomer.cod == cod) {
 Customer.saveNewCustomer(currCustomer).then(function (customer) {
        Cut.addCustomerToCut(customer._id, cutId).then(function (cut) {
                            deferred.resolve(cut);
                        })
                    })
                }
return deferred.promise;

所以,如果在 finalCuts 数组中我有一些带有字段代码的对象,例如 [c1: 12, c2: 14, c3: 14],那么在我的数据库中执行此函数后,我将有两个客户的代码14.

【问题讨论】:

标签: javascript node.js


【解决方案1】:

Q.all 一次运行所有的 Promise,而不是按顺序运行。如果您希望按顺序运行它们,您应该将它们排成队列:

func1().then(function() {
   ...
   return func2();
}).then(function() {
   ...
   return func3();
})
... etc

当 func1,func2,func3,... 返回承诺时

【讨论】:

    【解决方案2】:

    这不是这个问题的答案,而是你的问题的答案。如果您想“链式做事”,那么q 不是最好的选择。您应该为此使用 RxJS 框架。

    在这里阅读更多-> https://github.com/Reactive-Extensions/RxJS

    【讨论】:

      【解决方案3】:

      您可以按照 Q 文档的 Sequences 部分所述链接调用:

      var result = Q(null);
      finalCuts.forEach(function(currFinalCut) {
          result = result.then(function(){
              return checkAndSetCustomer(currFinalCut._id,currFinalCut.customerCod,customers);
          });
      });
      

      【讨论】:

        猜你喜欢
        • 2016-03-02
        • 2014-02-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多