顺序Q.all承诺nodejs

时间:2016-06-07 12:00:51

标签: javascript node.js

我尝试实现一个promise函数,在请求外部api之后,检查我的数据库是否存在对象,而在负面情况下,它会保存它。我使用此函数与Q.all中传递的数组,我看到所有对象都保存在同一时间,因此检查每次都失败,我有重复的对象。如何按顺序运行Q.all中传递的promise,而不是并行运行? 这是代码: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。

3 个答案:

答案 0 :(得分:0)

Q.all一次运行所有承诺,而不是按顺序运行。如果您希望按顺序运行它们,则应将它们排队,如:

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

当func1,func2,func3,...返回promises

答案 1 :(得分:0)

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

在此处阅读更多内容 - > https://github.com/Reactive-Extensions/RxJS

答案 2 :(得分:0)

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

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