2015-11-27 45 views
0

使用每個返回值有沒有人有一個想法如何做一個合理的承諾鏈這個異步JavaScript代碼:用不同的參數多次調用相同的函數。當完成:在其他功能

更新時間:

var arr1 = firstFunc(input1, function(err, res){ 
    if(err) return err; 
    return res; 
}); 

var arr2 = firstFunc(input2, function(err, res){ 
    if(err) return err; 
    return res; 
}); 

// When above functions done call this func: 

var arr3 = middleFunc(arr1, arr2, function(err, res){ 
    if(err) return err; 
    return res; 
}); 

// When above functions done call this func: 

var arr4 = lastFuntion(arr3); 
+1

這看起來並不是異步的,因爲你從函數獲得返回值。這很重要,因爲它對於如何構建承諾鏈非常重要。我們無法回答這個問題,請更新它以顯示實際的異步代碼。 –

+0

您可以將lastFunction和arr3作爲參數傳遞給中間函數,並將它們用作創建回調函數。或者您可以從middleFunc中返回承諾,然後檢查承諾是否完成,然後調用lastfn – joyBlanks

+0

您正在尋找'Promise.all'。根據你使用的lib,你也可以看看'Promise.join'或'spread'方法。 – Bergi

回答

1

的功能因爲他們的立場目前不是承諾。但是,它們會遵循節點中的異步模式。

您可以使用類似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 
+0

你真的應該使用通用promisifier,而不是重複相同的模式四次:-) – Bergi

+0

同意,這是在使用promisify節點:)的答案。 OP問及Promise,但未能證明他正在使用它,所以我認爲使用Promise的更詳細的答案將有助於顯示不同異步模式(Promise vs. Node Style Callbacks)之間的差異以及如何利用它們。 – Patrick

+0

我必須重複「firstFunc」才能使用承諾或可以重構嗎? – Rotareti

相關問題