循环蓝鸟承诺的最佳方式是什么
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) {
});
现在我正在使用 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) {
});