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

时间:2017-05-17 14:42:54

标签: node.js promise bluebird

我需要将bluebird承诺用于以下场景(已经使用顺序方法在本机承诺中实现),但是混淆了如何在bluebird中执行此操作。

data : 
  [
     {
         field1 : value1,
         field2 : [
             subfield1 : subvalue1,
             subfield2 : subvalue2 
         ]
         field3 : value3,
     },
     {
         field1 : value1,
         field2 : [
             subfield1 : subvalue1,
             subfield2 : subvalue2 
         ]
         field3 : value3,
     }
  ]
  • 所以我首先需要为每个块提供基于promise的并行循环
  • 在每个块中,我需要执行四个并行的单独功能(它们有自己的逻辑,如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);
    });
}

在任何实际操作之前执行但最终成功调用(请参阅此处的解决方法?)。

1 个答案:

答案 0 :(得分:1)

要理解的导入事项是promises是 result 值。你不能忘记return他们,否则他们会被忽略。您不需要“解决任何问题”,您需要做的只是return承诺,它们将自动链接:

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);
    });
}