Node.js 如何在特定场景中使用蓝鸟承诺
我需要在下面的场景中使用bluebird promise(已经在native promise中使用顺序方法实现了),但我不知道如何在bluebird中实现它Node.js 如何在特定场景中使用蓝鸟承诺,node.js,promise,bluebird,Node.js,Promise,Bluebird,我需要在下面的场景中使用bluebird promise(已经在native promise中使用顺序方法实现了),但我不知道如何在bluebird中实现它 data : [ { field1 : value1, field2 : [ subfield1 : subvalue1, subfield2 : subvalue2 ] field3 : value
data :
[
{
field1 : value1,
field2 : [
subfield1 : subvalue1,
subfield2 : subvalue2
]
field3 : value3,
},
{
field1 : value1,
field2 : [
subfield1 : subvalue1,
subfield2 : subvalue2
]
field3 : value3,
}
]
- 所以我首先需要一个基于承诺的并行循环,用于每个块
- 在每个块中,我需要执行四个并行的独立函数(它们有自己的逻辑,如http/db)
- 然后我需要第五个函数,它需要来自上述四个函数之一的数据
- 然后我需要保存函数
- 然后对下一个块重复相同的逻辑
- 最终解决承诺
var bbPromise = require("bluebird");
db.connect(dsn).then(prepareData).then( (results) => {
}).catch( (err) => {
console.log(err)
});
function prepareData(dbObject) {
let recordsToInsert = [];
let promises = [];
request.forEach(function(row, idx) {
let procesedRow = {
// data build from row
};
promises.push( childFunction(procesedRow));
});
bbPromise.all( promises).then( (results) => {
// resolve here ?
})
}
function childFunction(data) {
bbPromise.join(
firstFunction(data),
secondFunction(data),
thirdFunction(data),
fourthFunction(data)
)
.then( (results) => {
data.firstResults = results[0];
data.secondResults = results[1];
data.thirdResults = results[2];
data.fourthResults = results[3];
return data;
}).then( fifthFunction )
.then( (results) => {
data.fifthResults = results;
return insertData(data);
})
.then( (results) => {
bbPromise.resolve(results);
});
}
在任何实际操作之前执行它的工作但最后成功的调用(请参见此处的resolve?)。需要理解的重要一点是,承诺是结果值。您不能忘记返回它们,否则它们将被忽略。您不需要“解决任何问题”,只需
返回
承诺,承诺将自动链接:
function prepareData(dbObject) {
let recordsToInsert = [];
let promises = request.map(function(row, idx) {
// ^^^
let procesedRow = {
// data build from row
};
return childFunction(procesedRow);
// ^^^^^^ (ok, `push` would've worked as well)
});
return bbPromise.all(promises);
// ^^^^^^
}
function childFunction(data) {
return bbPromise.join(
// ^^^^^^
firstFunction(data),
secondFunction(data),
thirdFunction(data),
fourthFunction(data)
).then(results => {
data.firstResults = results[0];
data.secondResults = results[1];
data.thirdResults = results[2];
data.fourthResults = results[3];
return data;
}).then(fifthFunction).then(results => {
data.fifthResults = results;
return insertData(data);
});
}
嗯,它起作用了。他们是否有任何特定情况下我们必须使用resolve而不是return?在
新承诺中-即几乎从不