Node.js 如何在特定场景中使用蓝鸟承诺

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

我需要在下面的场景中使用bluebird promise(已经在native promise中使用顺序方法实现了),但我不知道如何在bluebird中实现它

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?在
新承诺中-即几乎从不