2016-05-16 5 views
0

を解決したときに、他の約束によって作成されたデータに依存するコードの一部があるとき、私は追加のヘルパー約束を作成する必要があります:注文約束が

var dfd1,dfd2; 
    dfd1 = $q.defer(); 
    dfd2 = $q.defer(); 
    Service1.queryAll().then(function(data) { 
     // prepare data 1 
     dfd1.resolve(); 
    }); 

    Service2.queryAll().then(function(data) { 
     // prepare data 2 
     dfd2 .resolve(); 
    }); 

    $q.all([dfd1.promise,dfd2.promise]).then(function() { 
     // use data 1 & 2 
    }) 

または私はqueryAll()によって返された約束を使用することができます$q.allにお電話ください。

私は意味:Service1Service2成功コールバックが実行を終了する前に、次に$q.allコールバックが実行される前の成功コールバックが終了した後に実行$q.allにコールバックされます、またはケースがあるかもしれませんか?

+1

プロミスコールバックは常に、登録された順に呼び出されます – Alnitak

答えて

0

これは、$qとは関係ありません。ここに例があります:

var p1 = Service1.queryAll(); 

var p2 = p1.then(function (response) { ... }); 

//Everything chained to p1 will resolve BEFORE p2 is executed. 
//Naturally everything chained to p2 will execute after p1 and p2. 

イベントハンドラのような約束を考えることができます。 .thenを呼び出すと、イベントに別のイベントハンドラが追加されます。

p1は、それに登録されたすべてのイベントハンドラをループし、それを実行し解決するとき:

//Inside promise implementation 
var eventHandlers = []; 

this.then = function(fn){ 
eventHandlers.push(fn); 
if(!this.executed) 
    this.execute(); 
} 

function whenResolved(data){ 
eventHandlers.forEach(function(fn){ 
    fn(data); 
}); 
} 

注:これはこれは約束が解決された場合でも、あなたはまだ新しく登録されたイベントハンドラを実行するので、作品の実際の方法ではありませんこれがどのように機能するかをよりよく理解するかもしれません。