2016-04-12 18 views
3

Bir görev grubunun ne zaman tamamlandığını algılamak için açıları 2 açılıyorum. Ben ne anlamak angular2.0.0 beta 14bölge tüm görev tamamlandığında algılandı

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); 
    }); 
}); 

kullanarak aşağıdaki kodu var, her çatal oluşturulan görev ve bölgesinden sonra görevin öncesinde bir tetikleyecektir. aşağıdaki log bu kod ile: englobing görevin 'afterTask' denirdi sonra

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

Nedense, setTimeout için bölge oluşturuldu. Son sayım 1000 milisaniyenin bekleme süresinden sonra basıldı.

Her şeyin ne zaman yapıldığını nasıl algılayabilirim?

cevap

1

setTimeout görevi aslında aynı bölge altında yürütülür ve ilk yürütme ile aynı yürütme bağlamını paylaşır. AfterTask olayının, setTimeout tarafından sıraya dizilen görevden önceki ilk çatal ateşleri için kanca olmasının nedeni, setTimeout'un semantiklerinden kaynaklanmaktadır. Javascript'in async semantiği hakkında bazı ayrıntılara ihtiyacınız varsa, MDN ile ilgili iyi bir makale var.

Bölge için, yürütmenin geciktirilebileceği tek örnek bir zaman uyumsuz görevle yapılır ve bunlar enqueueTask ve dequeueTask tanıtımı kullanılarak izlenebilir. Herhangi bir olay olması koşuluyla, bir bölgedeki tüm görevlerin ne zaman tamamlandığını belirlemek için bu kancaları zamanlanmış görev sayacıyla birleştirebilirsiniz. Plnkr example