Javascript 区域检测所有任务何时完成

Javascript 区域检测所有任务何时完成,javascript,angular,Javascript,Angular,我试图使用angular 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'); }, '+onZoneCrea

我试图使用angular 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);
    });
});
据我所知,每个fork将在创建任务之前、任务之后和区域之后触发一个fork。使用此代码,它将记录以下内容:

before
1
2
allo
after
1
<html><body>Hello world</body></html>
after
之前
1.
2.
阿洛
之后
1.
你好,世界
之后
出于某种原因,setTimeout区域是在调用englobing任务的“后任务”后创建的。上次计数是在等待1000毫秒后打印的


如何检测何时完成所有操作?

setTimeout任务实际上是在同一区域下执行的,并且与初始fork共享相同的执行上下文。初始fork的后任务事件钩子在setTimeout排队的任务完成之前触发的原因是setTimeout的语义。如果您需要有关Javascript异步语义的一些详细信息,有一篇很好的文章介绍

对于区域,唯一可以延迟执行的实例是通过异步任务,并且可以使用
enqueueTask
dequeueTask
道具监视这些情况。您可以将这些挂钩与计划任务计数器结合起来,以确定区域中的所有任务何时完成,前提是不存在任何事件