无法理解 zone.js 示例

Can't understand zone.js example

这是演示 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 在这里有什么特别的?

区域允许您在区域中封装的异步操作中保留一些属性。所以基本上这里它表明没有 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 因为当前区域无法从分叉区域访问 属性。