循环蓝鸟承诺的最佳方式是什么

What is the best way to loop bluebird promises

现在我正在使用 NodeJS 和 Sequelize 来查询和处理数据库数据。 我从 Table1 调用了 findAll,我想查询每一行以将一些数据应用到 Table2,然后我想在发送输出之前将所有数据添加到数组,我这样做了

var last_promise;
var output_results = {};
Table1Model.findAll()
.then(function(results1)
{
    for (var i = 0; i < results1.length; ++i)
    {
        var result1 = results1[i];
        output_results[result1.id] = result1;
        var add_promise = Table2Model
            .create({
                id_from_table1: result1.id,
                data_from_table1: result1.data
            });
            .then(function(result2) {
                output_results[result2.id_from_table1].data2 = result2;
            });
            if (last_promise)
            {
                last_promise.then(function()
                {
                    return add_promise;
                });
            } else {
                last_promise = add_promise;
            }
        }
    }
}
last_promise.then(function() {
    return output_results;
}

我想知道有没有更好的方法可以像这样在循环中顺序执行承诺?

看起来你可以用 .all() 方法做到这一点:

Table1Model
  .findAll()
  .then(function(results1) {
    return Promise.all(results1.map(function(result) {
      return Table2Model
        .create({
            id_from_table1: result1.id,
            data_from_table1: result1.data
        })
        .then(function(result2) {
            ...
        });
    }));
  })
  .then(function(output_results) {
  });