2014-11-05 32 views
0

當我有多個承諾,並逐一解決他們,我可以很容易地得到每個承諾,當它正在解決它的通知。AngularJs鏈接promisses和使用通知

但是,當我鏈接承諾或使用all()方法,然後一些通知正在丟失。我想知道爲什麼是這樣。

這裏是一個例子。比方說,我有兩個異步函數返回一個承諾,做了一些工作,而這樣做,他們打電話通知一次或多次:

function returnsSomePromise1() {...; setTimeout(...); return promise;} 

function returnsSomePromise2() {...; setTimeout(...); return promise;} 

現在我有三個選項來解決的承諾:

var promise1 = returnsSomePromise1(); 
var promise2 = returnsSomePromise2(); 

//Option 1: Resolve separate 
promise1.then(...); 
promise2.then(...); 

//Option 2: Resolve chained 
promise1.then(promise2).then(...); 

//Option 3: Resolve with all() 
$q.all([promise1, promise2]).then(...); 

在每一個功能,然後我附上一個簡單的函數來通知登錄到控制檯:

.then(..., ..., function(update) { console.log(update); }); 

現在我覺得很有趣的是,所有三個選項產生時,不同的結果來通知。第一個打印每個異步操作的所有通知。第二個選項僅打印第一個承諾的通知,使用all()方法的最後一個選項根本不打印任何通知。

任何人都可以解釋什麼是造成這些差異,如果它可以得到通知時,使用$q.all()

+0

$ q.all返回所有響應的陣列$ q.all()。然後(arrayOfResponses),你可以使用一個for循環遍歷它們的對象。 – 2014-11-05 14:27:21

+0

我認爲這是不正確的,'all()'接受一組promisses並返回一個promise,用'then()'傳遞一個響應數組給第一個回調函數。至少這就是我如何使用它。 – lanoxx 2014-11-05 14:42:45

+0

是的肯定$ q.all返回一個承諾 – 2014-11-05 14:49:01

回答

0

選項1將並行觸發承諾,它們將單獨解決。如果你想在兩者都解決後做點什麼,你需要使用這個選項添加額外的邏輯

選項2將一個接一個地觸發承諾。如果promise2取決於promise1中的某些內容,這很有用。

此外,你的代碼應該是promise1.then(returnsSomePromise2).then(...);它想要一個函數在.then()之前它得到承諾(promise2)。它所調用的函數將返回承諾,並會將其鏈接起來。

選項3將並行觸發並在兩個(全部)完成時解析函數。 $q.all()可以採取數組或對象。在你的例子中有一個數組。傳遞給.then()的函數將傳遞一個數組。具有承諾順序的數組行傳遞給$.all()

$q.all([promise1, promise2]).then(function(result){ 
    var promise1Result = result[0]; 
    var promise2Result = result[1]; 
}) 

如果你傳遞一個對象,名爲鍵,你會得到一個對象返回在函數傳遞給.then()。鑰匙將排隊與傳遞給$q.all()

$q.all({myFirstPromise:promise1, secondPromise:promise2}).then(function(result){ 
    var promise1Result = result.myFirstPromise; 
    var promise2Result = result.secondPromise; 
}) 
+0

對不起,但這並不回答我的問題。我已經知道如何使用三種選項中的每一種,以及它們的區別是什麼。我的問題是關於爲什麼通知會在所有三個版本中產生不同的結果,以及爲什麼特別是某些通知會丟失。 – lanoxx 2014-11-06 10:48:46

+0

這個答案「任何人都可以解釋是什麼導致了這些差異,並且如果可以在使用$ q.all()時得到通知嗎?」請仔細閱讀選項2的答案解釋。它解釋了它爲什麼會迷路。另外我注意到你正在使用setTimeout,還有一個角函數$ timeout,它返回一個promise。 – TheSharpieOne 2014-11-06 13:16:39