2017-02-07 5 views
4

$qの仕組みにはかなり慣れていますし、anglejsでそれを使用して解決することを約束し、$q.all()で解決することを約束します。

これは可能なのかどうかわかりません(正しく動作すれば):私は1つの約束を待つことができますか? 。個々の約束の成功コールバックは、例えば...終了した後:

var promises = []; 
for(i=1, i<5, i++){ 
    var singlePromise = SomeSevice.getData(); 
    promises.push(singlePromise); 
    singlePromise.then(function(data){ 
     console.log("This specific promise resolved"); 
    }); 
} 


// note: its important that this runs AFTER the code inside the success 
// callback of the single promise runs .... 
$q.all(promises).then(function(data){ 
    console.log("ALL PROMISES NOW RESOLVED"); // this code runs when all promises also resolved 
}); 

私の質問は、私はそれがないと思うと、この作業を行い、またはいくつかの奇妙な非同期、決定不能の結果リスクがありますか?

+0

こんにちは、私は私の質問に少し変更を加えました。主な要件は、個々の約束の成功コールバックが終了した後にall()コールバックが実行されることです。 – rex

+0

私はそれを見て、それはもはや関連性がないので、私のコメントを削除しました。 – lonesomeday

+0

あなたの質問は実際に '.all'コールバックが**最後の' singlePromise.then'コールバックの後に常に起動されるかどうかです。 – devqon

答えて

5

thenの呼び出しでも約束が返されます。元の約束ではなく、配列に渡すことができます。あなたの$q.allがあなたのすべてのthenが実行された後に実行されるこのように。

var promises = []; 
for(i=1, i<5, i++){ 
    // singlePromise - this is now a new promise from the resulting then 
    var singlePromise = SomeSevice.getData().then(function(data){ 
     console.log("This specific promise resolved"); 
    }); 
    promises.push(singlePromise); 
} 

$q.all(promises).then(function(data){ 
    console.log("ALL PROMISES NOW RESOLVED"); 
}); 
+1

これは華麗に聞こえる - 私はそれを試してみます。 – rex

+2

プロミスが失敗した場合、すべてのチェーンの約束は停止しますが、個々の約束にキャッチを入れるとチェーンの約束が続き、catchの各約束はpromise.allの配列インデックスで未定義に戻ります。 –

+0

@RafaelDantas - 良い点。私はそれを考慮しなかったわけではありませんが、私はそれが問題の範囲外であると感じていました。オペレータは、コードがフォールトトレラントであることを確実にするために最終的なコードでそれを考慮する必要があります。 – Igor

関連する問題