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

时间:2017-12-18 17:48:59

标签: node.js asynchronous promise bluebird

我可能会搞乱我目前处于同步状态的事情,并且很乐意在调试半天之后接受任何帮助。

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

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

    我目前拥有以下内容(使用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-block在其他完成之前被调用。

    但是,在每次更新完成之后,我无法确定在何处以及如何处理对客户端的响应?我在Promise.map(arrayOfFoos, function(foo, index)中得到的索引在处理期间完全搞乱了,当索引等于arrayOfFoos.length时,我似乎无法依赖它来发送响应。

    由于可能会有相当多的实体在此过程中进行更新,因此我不希望这样同步,因为我可以避免在此过程中不阻止后端。

    提前谢谢!


    致以最诚挚的问候,

    Vegaaaa

1 个答案:

答案 0 :(得分:2)

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

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

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