以下是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.inTheZone
是undefined
,因为我们更改了Zone.current.inTheZone = true;
,这是现在第二次输出的值。 zone
在这做什么特别的事?
答案 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
,因为当前区域无法从分叉区域访问该属性。