上下文的传播允许在 zone 上附加数据。这些数据随后会跟着 zone 一起在异步调用中传递。
let rootZone = Zone.current;
// fork rootZone 并且附加数据
let zoneA = rootZone.fork({name: 'zoneA', properties: {a: 1, b:1}});
// Fork zoneA 并且附加数据,部分数据会覆盖 zoneA 的数据。
let zoneB = zoneA.fork({name: 'zoneB', properties: {a: 2}});
// 查询 zoneA 并返回期望的数据
expect(zoneA.get('a')).toEqual(1);
expect(zoneA.get('b')).toEqual(1);
// 查询 ZoneB 并返回期望的数据,a 被重新定义为 2
expect(zoneB.get('a')).toEqual(2);
// 由于 ZoneB 没有定义 b 的值,因此返回 zoneA 上的 b 的值
expect(zoneB.get('b')).toEqual(1);
重点:
附加的数据都是浅不可变的。(一旦 zone 被 fork,它的属性就不能修改。)
译注:这里的“浅”和 “浅复制”的“浅”是同一个意思
子 zone 会继承父 zone 的属性。(在子 zone 中运行的代码应该与在其父 zone 中运行的结果相同,前提是子 zone 没有显示覆盖代码所依赖的值。)
- 由于 zone 维持于整个异步操作间,所以其对应的属性也随之在整个异步操作过程中可以访问,从而允许一种通信方式。