所有任务完成后检测区域

时间:2016-04-12 14:45:27

标签: javascript 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);
    });
});

根据我的理解,每个分支都会在创建任务和区域后触发之前的任务。使用此代码,它将记录以下内容:

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

由于某种原因,setTimeout的区域是在&#39; afterTask&#39;之后创建的。调用了一项令人费解的任务。在1000毫秒的等待时间之后打印最后一次计数。

如何检测一切何时完成?

1 个答案:

答案 0 :(得分:1)

setTimeout任务实际上是在同一个区域下执行,并且与初始fork共享相同的执行上下文。在setTimeout排队的任务完成之前,初始fork的afterTask事件挂接的原因是由于setTimeout的语义。如果你需要关于Javascript的异步语义的一些细节,那么MDN上有一篇很好的文章。

对于区域,唯一可以延迟执行的实例是通过异步任务,可以使用enqueueTaskdequeueTask道具观察这些。您可以将这些挂钩与计划任务计数器组合,以确定区域中的所有任务何时完成,前提是没有事件。 Plnkr example