然后在 Promise.all 完成之前执行
Then executes before Promise.all finishes
我有这段代码,我希望所有 chargeCreatePromises 在 orderUpdatePromises 执行之前完成执行:
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 -> https://github.com/kriskowal/q
节点 4
编辑:
我将 Q.all(chargeCreatePromises)
更改为 Q.allSettled(chargeCreatePromises)
,但该行为仍然存在。
我用这个更改更新了上面的代码。
I expect that all chargeCreatePromises
finishes to execute before orderUpdatePromises
executes
当您在循环中调用 createForThisMonth(…)
和 orderUpdate(…)
时,执行开始 - 一次。 Q.all
代码只等待它们,但它们会 运行 同时并以任何顺序完成。
如果您希望所有 chargeCreatePromises
先完成,请将对 orderUpdate(…)
的调用放在 .then()
处理程序中:
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);
});
}
我有这段代码,我希望所有 chargeCreatePromises 在 orderUpdatePromises 执行之前完成执行:
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 -> https://github.com/kriskowal/q
节点 4
编辑:
我将 Q.all(chargeCreatePromises)
更改为 Q.allSettled(chargeCreatePromises)
,但该行为仍然存在。
我用这个更改更新了上面的代码。
I expect that all
chargeCreatePromises
finishes to execute beforeorderUpdatePromises
executes
当您在循环中调用 createForThisMonth(…)
和 orderUpdate(…)
时,执行开始 - 一次。 Q.all
代码只等待它们,但它们会 运行 同时并以任何顺序完成。
如果您希望所有 chargeCreatePromises
先完成,请将对 orderUpdate(…)
的调用放在 .then()
处理程序中:
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);
});
}