无法理解zone.js示例

时间:2016-11-10 15:17:35

标签: javascript angular angular2-zone

以下是here中展示zone.js功能的代码:

Zone.current.fork({}).run(function () {
    Zone.current.inTheZone = true;

    setTimeout(function () {
        console.log('in the zone: ' + !!Zone.current.inTheZone);
    }, 0);
});

console.log('in the zone: ' + !!Zone.current.inTheZone);

以上将记录:

'in the zone: false'

'in the zone: true'

我真的不明白该区域在这里做了什么,以及它如何与拦截this video所涉及的事件有关。

它首次输出false,因为Zone.current.inTheZoneundefined,因为我们更改了Zone.current.inTheZone = true;,这是现在第二次输出的值。 zone在这做什么特别的事?

1 个答案:

答案 0 :(得分:1)

Zone允许您在区域中封装的异步操作中保留一些属性。所以基本上这里显示了当前区域没有inTheZone属性。但是当您执行zone.fork().run()时,回调将在新的分叉区域中执行,异步任务setTimeout也将在此分叉区域中执行。并且您将获得此区域内的inTheZone属性,但在其他区域中无法访问。这可能是一个更好的例子:

Zone.current.fork({}).run(function () {
    Zone.current.inTheZone = true;

    setTimeout(function () {
        console.log('in the zone: ' + !!Zone.current.inTheZone); // true
    }, 2000);
});

setTimeout(function () {
    console.log('in the zone: ' + !!Zone.current.inTheZone); // false
}, 1000);

正如您所看到的,这里有两个异步任务。并且来自当前区域的setTimeout将比分叉区域的超时更早执行。 run()是同步的,因此在执行第一个setTimetout之前,inTheZone应设置为true。但它已记录为false,因为当前区域无法从分叉区域访问该属性。