如何获取 async forEach 的最后一个进程?

How to get last process of async forEach?

我可能在我目前所处的异步地狱中搞砸了,现在调试半天后很乐意接受任何帮助。

任务是异步更新数据库中的一堆实体。它是:

  1. 获取 Foo 类型的实体列表
  2. 对于这些元素中的每一个,在数据库中更新它
  3. SELECT 个具有相应条件的 Bar 类型的实体并相应地更新它们
  4. 所有更新后 return 形式为 [{entity: 'Foo || Bar', id: foo.id || bar.id}]
  5. 的对象数组

我目前拥有的是以下内容(使用 Bluebird Promise.map):

exports.updateFooAndBars = function (req, res) {
  var arrayOfFoos = req.body;
  var projectId = req.params.projectId;
  var result = [];
  Promise.map(arrayOfFoos, function(foo, index){
    var fooId = foo.id;
    fooLib.update(foo, fooId)
    .then(function (updatedFoo){
      return barLib.update(foo, projectId);
    });
  })
  .then(function(result) {
    // handles PUT responses
    updated(res, result);
  })
  .catch(function(err) {
      .....
  )};

这当然行不通,因为最后一个 .then 块在其他块完成之前被调用。

但是我无法找到在每次更新完成之后我可以在哪里以及如何跳入以处理对客户端的响应?我在 Promise.map(arrayOfFoos, function(foo, index) 中获得的索引在处理过程中完全混乱,以至于当索引等于 arrayOfFoos.length.

时,我似乎无法依赖它来发送响应

并且由于可能有相当多的实体将在此过程中更新,所以我不想同步进​​行此操作,因为我可以避免在过程中不阻塞后端。

提前致谢!


此致,

织女星

您没有return使用 fooLib.update() 创建的 Promise 链。您的 Promise.map() 正在遍历数组中的所有项目,调用回调并立即继续您的 Promise.map() 上的 .then(),而不是等待从每个项目创建的所有 Promise 链fooLib.update() 来电。

使用 Promises 时,如果创建了任何内部 Promise,您需要 return 每一个以确保 Promise 链完全等待所有异步工作,如果这是您的代码所需要的。

Promise.map(arrayOfFoos, function(foo, index){
  var fooId = foo.id;
  return fooLib.update(foo, fooId)
    .then(function (updatedFoo){
      return barLib.update(foo, projectId);
    });
  })