我尝试实现一个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。
答案 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);
});
});