的功能因爲他們的立場目前不是承諾。但是,它們會遵循節點中的異步模式。
您可以使用類似promisify節點或自己做:
// define the first 2 promises by calling firstFunc with inputs
var promise1 = new Promise(function resolver(resolve, reject) {
firstFunc(input1, function(err, res){
if(err) reject(err);
resolve(res);
});
var promise2 = new Promise(function resolver(resolve, reject) {
firstFunc(input2, function(err, res){
if(err) reject(err);
resolve(res);
});
// When promise1 & 2 resolve, execute the then handler
Promise.all([promise1, promise2]).then(function (arr) {
// Grab the resolved values
var arr1 = arr[0];
var arr2 = arr[1];
// return a new promise that is resolved when middleFunc completes
return new Promise(function resolver(resolve, reject) {
middleFunc(arr1, arr2, function(err, res){
if(err) reject(err);
resolve(res);
});
});
}).then(function (arr3) { // Execute this when middleFunc completes
return lastFuntion(arr3); // This function looks synchronous
}).catch(function (err) {
// Handle any errors along the way
});
編輯:如果您想更普遍地創造promise1和promise2,寫一個輔助函數:
// Helper function to construct a promise by calling firstFunc with input
var firstFuncHelper = function (input) {
return new Promise(function resolver(resolve, reject) {
firstFunc(input, function(err, res){
if(err) reject(err);
resolve(res);
});
};
var promise1 = firstFuncHelper(input1);
var promise2 = firstFuncHelper(input2);
// Rest of code above remains
這看起來並不是異步的,因爲你從函數獲得返回值。這很重要,因爲它對於如何構建承諾鏈非常重要。我們無法回答這個問題,請更新它以顯示實際的異步代碼。 –
您可以將lastFunction和arr3作爲參數傳遞給中間函數,並將它們用作創建回調函數。或者您可以從middleFunc中返回承諾,然後檢查承諾是否完成,然後調用lastfn – joyBlanks
您正在尋找'Promise.all'。根據你使用的lib,你也可以看看'Promise.join'或'spread'方法。 – Bergi