2016-04-12 24 views
3

私は角度2のゾーンを使用して、タスクのグループが完了したときを検出しようとしています。私は私が理解からangular2.0.0ベータ14ゾーンがすべてのタスクが完了したときに検出します

var count = 0; 
Zone.fork({ 
    '+beforeTask':() => { if (count === 0) console.log('before'); }, 
    '+afterTask':() => { if (--count === 0) console.log('after'); }, 
    '+onZoneCreated':() => { console.log(++count); } 
}).run(() => { 
    this.http.get('/index.html').subscribe(response => { 
     console.log('allo'); 

     setTimeout(() => console.log(response.text()), 1000); 
    }); 
}); 

を使用して、次のコードを持って、各フォークが作成されたタスクとゾーンの後、タスクの前にトリガされます。このコードでは、それは次のようにログに記録します。

before 
1 
2 
allo 
after 
1 
<html><body>Hello world</body></html> 
after 

何らかの理由でenglobingタスクの「afterTask」が呼ばれた後、setTimeoutメソッドのためのゾーンが作成されました。最後のカウントは、1000ミリ秒の待ち時間の後に印刷されました。

すべての処理が完了したらどうすれば検出できますか?

答えて

1

setTimeoutタスクは、実際には同じゾーンで実行され、最初のフォークと同じ実行コンテキストを共有します。 setTimeoutによってキューに入れられたタスクが完了する前に、初期フォークのafterTaskイベントフックが発生するのは、setTimeoutのセマンティクスによるものです。 Javascriptの非同期セマンティクスに関する詳細が必要な場合は、MDNにある良い記事があります。

ゾーンの場合、実行が遅延する唯一のインスタンスは、非同期タスクによるもので、enqueueTaskおよびdequeueTaskの小道具を使用して監視できます。イベントがない場合、これらのフックをスケジュールされたタスクカウンタと組み合わせて、ゾーン内のすべてのタスクが完了したタイミングを判断できます。 Plnkr example

関連する問題