2017-05-17 14 views
-1

我需要爲以下場景使用藍鳥承諾(已經在使用順序方法的本機承諾中實現過),但是混淆瞭如何在藍鳥中實現。如何使用特定場景的藍鳥承諾

data : 
    [ 
    { 
     field1 : value1, 
     field2 : [ 
      subfield1 : subvalue1, 
      subfield2 : subvalue2 
     ] 
     field3 : value3, 
    }, 
    { 
     field1 : value1, 
     field2 : [ 
      subfield1 : subvalue1, 
      subfield2 : subvalue2 
     ] 
     field3 : value3, 
    } 
    ] 
  • 所以我首先我需要基於並行循環爲每個塊
  • 在每個塊中我需要執行四個並行獨立的功能的承諾(它們有自己的邏輯像HTTP /分貝)
  • 然後我需要第五功能,其需要的數據來自上述四個功能
  • 然後我需要保存功能
  • 然後相同的邏輯重複對下一個塊的一個
  • 最終解決承諾

目前我試過類似以下

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

需要了解的導入事項是承諾結果值。你不能忘記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); 
    }); 
} 
+0

嗯,它的工作。他們是否有任何特定的情況下我們必須使用決心而不是退貨? –

+0

在「新承諾」內 - 即幾乎從不 – Bergi