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

时间:2015-07-23 12:18:05

标签: node.js promise bluebird

现在我正在研究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;
}

我想知道有更好的方法在这样的循环中顺序执行promise吗?

1 个答案:

答案 0 :(得分:1)

看起来你可以用.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) {
  });