Node.js 然后在承诺之前执行。所有完成
我有一段代码,我希望所有chargeCreatePromises都在orderUpdatePromises执行之前执行:Node.js 然后在承诺之前执行。所有完成,node.js,mongodb,promise,q,Node.js,Mongodb,Promise,Q,我有一段代码,我希望所有chargeCreatePromises都在orderUpdatePromises执行之前执行: return Q.all(chargeCreatePromises) .then(function() { return Q.all(orderUpdatePromises) }) 代码的结构如下所示: function createForThisMonth(order) { return Q.all([ Order.findOne({ _id:
return Q.all(chargeCreatePromises)
.then(function() {
return Q.all(orderUpdatePromises)
})
代码的结构如下所示:
function createForThisMonth(order) {
return Q.all([
Order.findOne({ _id: order._id }),
Charge.findOne({
"orders._id": order._id,
chargeMonth: moment().format("YYYY-MM")
})
]).spread(function(order, charge) {
console.log("completed: ", order.completed)
if (!charge && !order.completed) {
return createChargeFromOrder(order)
// returns a promise with Charge.findOrCreate(newCharge);
}
})
}
function orderUpdate(order) {
return Q(Order.findOneAndUpdate({
{ _id: order._id },
{ $set: { completed: true } }
}))
}
function process(orders) {
var chargeCreatePromises = [];
var orderUpdatePromises = [];
orders.forEach(function(order) {
if (order.category === 'monthly') {
chargeCreatePromises.push(createForThisMonth(order))
}
orderUpdatePromises.push(orderUpdate(order))
})
return Q.allSettled(chargeCreatePromises)
.then(function() {
return Q.all(orderUpdatePromises)
})
}
在不同的执行中,日志为:
completed: true
completed: false
completed: false
completed: true
completed: false
因此,我认为有时then(Q.all(orderUpdatePromises))
在Q.all(chargeCreatePromises)
完成之前执行
有谁能帮我了解这里发生的事情并实现我的目标
Q->
节点4
编辑: 我将
Q.all(chargeCreatePromissions)
更改为Q.allSetted(chargeCreatePromissions)
,但该行为仍然存在。
我用这个更改更新了上面的代码
我希望所有的chargeCreatePromises
在orderUpdatePromises
执行之前完成执行
当您在循环中同时调用createforthismount(…)
和orderUpdate(…)
时,执行开始。Q.all
代码只等待它们,但它们将并发运行并以任何顺序完成
如果希望首先完成所有chargeCreatePromissions
,请将对orderUpdate(…)
的调用放入处理程序中。然后()
function process(orders) {
var chargeCreatePromises = orders.filter(function(order) {
return order.category === 'monthly';
}).map(createForThisMonth);
return Q.allSettled(chargeCreatePromises).then(function() {
var orderUpdatePromises = orders.map(orderUpdate);
return Q.all(orderUpdatePromises);
});
}
我试图理解orderUpdatePromises(orderUpdate(order))
,难道orderUpdatePromises
不是一个数组吗?你打算orderUpdatePromises.push(orderUpdate(order))
?请注意,orderUpdate
中没有返回任何内容。您应该在那里添加return
对不起,是的。。。我会编辑我还修复了代码createforthismount()
不返回任何东西=>chargecreatepromissions
不是一个承诺数组,它是一个未定义的数组这确实是一种方式!正在分离循环调用。。。