我尝试使用角度2中的区域来检测一组任务何时完成。我有使用angular2.0.0 beta 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
由于某种原因,setTimeout的区域是在&#39; afterTask&#39;之后创建的。调用了一项令人费解的任务。在1000毫秒的等待时间之后打印最后一次计数。
如何检测一切何时完成?
答案 0 :(得分:1)
setTimeout任务实际上是在同一个区域下执行,并且与初始fork共享相同的执行上下文。在setTimeout排队的任务完成之前,初始fork的afterTask事件挂接的原因是由于setTimeout的语义。如果你需要关于Javascript的异步语义的一些细节,那么MDN上有一篇很好的文章。
对于区域,唯一可以延迟执行的实例是通过异步任务,可以使用enqueueTask
和dequeueTask
道具观察这些。您可以将这些挂钩与计划任务计数器组合,以确定区域中的所有任务何时完成,前提是没有事件。 Plnkr example