2015-10-08 140 views
0

工具:ES6 JavaScriptJavaScript:多個承諾對象被鏈接

也許這是所有的肉汁。我只需要一個快速的同行評審,以確保我沒有做(醜陋/犯罪)。

我抓住不同模塊的承諾,然後鏈接它們。我無法找到一個很好的示例鏈接多個承諾對象(不要與鏈接承諾與順序回調混淆)等語法混淆了我,因爲我不知道是否我開始嵌套承諾語法上或不。

我覺得promise.all應該在混合中,,但由於我有一些函數(如果你願意回調)定義成功和失敗操作在中間層 - 使用promise.all語法混亂。

例如讓我們得到2個承諾。我們完成第一場,然後打第二場。如果他們都成功 - 做一些手術成功,否則失敗的操作,最後做一個整理回調與成敗對象的引導:

bootStrapProgram = function(callback){ 

    var promise1 = module1.getPromise1(); 
    var promise2 = module2.getPromise2(); 

     promise1.then(promise2.then(successOperation,failureOperation).then(callback)); 

} 

successOperation = function(){ 
    //Shoot out confetti or something I don't care. 
} 

failureOperation = function(){ 
//I dunno, Fire Le Missles! 
} 

回答

4

如果你只是想知道當這兩個操作完成,那麼你可以這樣做:

var promise1 = module1.getPromise1(); 
var promise2 = module2.getPromise2(); 
Promise.all(promise1, promise2).then(function() { 
    // success here 
}, function(reason) { 
    // error here 
}); 

如果你想先執行一個操作,那麼你可以像這樣序列化它們:

module1.getPromise1().then(function(value1) { 
    return module2.getPromise2(); 
}).then(function(value2) { 
    // success here 
}, function(reason) { 
    // error here 
}); 
+0

如果第二個承諾需要它,需要傳遞值1嗎?例如:.then(function(value1){return module2.getPromise2(value1); –

+1

@NickPineda - 如果您想將'value1'傳遞給'getPromise2()',那麼歡迎您在第二個例子中這樣做。我沒有看到你作爲要求說的地方,所以我沒有表明這一點,但如果你願意的話,你可以自由地做到這一點。在第一個例子中你不能這麼做,因爲兩個操作都是同時開始的,因此一個結果不能用於另一個結果。 – jfriend00

1

Promise.all不一定語法混亂,你在做什麼可能是。你的代碼表明,promise1和promise2必須按照這個時間順序進行處理,但這不一定是正確的。

var promise1 = foo.get(), promise2 = bar.get(); 

promise1.catch(failure1Fn); 
promise2.catch(failure2Fn); 

Promise 
    .all([promise1, promise2]) 
    .then(bothSucceededFn); 

現在你保持單獨的錯誤處理,但有全部成功的情況下處理。不要忘記,僅僅因爲你在一組Promise中調用Promise.all並不意味着你不能單獨處理每一個。

如果你不真的需要有那麼獨立的錯誤處理只是

Promise 
    .all([promise1, promise2]) 
    .then(bothSucceededFn) 
    .catch(failureFn); 
+0

A related cl arifying問題:在promise.all鏈中是否有一個值(來自解析被調用)被傳遞到鏈中? promise1 --- val1 - > promise2 ---> val2 ---> bothSucceededFn。 –

+1

'Promise.all'返回來自所有promise的值的數組,如果它們全部成功,或者如果失敗則返回第一個錯誤。考慮這一點的一種方法是按照詹姆斯·科格蘭(James Cogland)的說法,它將內容變爲現實:你給它一張Promise的列表,它給你一個列表的承諾。因此,如果'foo.get()'成功並返回'foo'和'bar.get()'成功並返回'bar',那麼連接到'Promise.all'的'.then'處理程序將被傳遞一個像這樣的數組:['foo','bar'] –