Node.js 然后在承诺之前执行。所有完成

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:

我有一段代码,我希望所有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->

节点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
不是一个承诺数组,它是一个未定义的
数组这确实是一种方式!正在分离循环调用。。。