上下文的传播允许在 zone 上附加数据。这些数据随后会跟着 zone 一起在异步调用中传递。

  1. let rootZone = Zone.current;
  2. // fork rootZone 并且附加数据
  3. let zoneA = rootZone.fork({name: 'zoneA', properties: {a: 1, b:1}});
  4. // Fork zoneA 并且附加数据,部分数据会覆盖 zoneA 的数据。
  5. let zoneB = zoneA.fork({name: 'zoneB', properties: {a: 2}});
  6. // 查询 zoneA 并返回期望的数据
  7. expect(zoneA.get('a')).toEqual(1);
  8. expect(zoneA.get('b')).toEqual(1);
  9. // 查询 ZoneB 并返回期望的数据,a 被重新定义为 2
  10. expect(zoneB.get('a')).toEqual(2);
  11. // 由于 ZoneB 没有定义 b 的值,因此返回 zoneA 上的 b 的值
  12. expect(zoneB.get('b')).toEqual(1);

重点:

  • 附加的数据都是浅不可变的。(一旦 zone 被 fork,它的属性就不能修改。)

    译注:这里的“浅”和 “浅复制”的“浅”是同一个意思

  • 子 zone 会继承父 zone 的属性。(在子 zone 中运行的代码应该与在其父 zone 中运行的结果相同,前提是子 zone 没有显示覆盖代码所依赖的值。)

  • 由于 zone 维持于整个异步操作间,所以其对应的属性也随之在整个异步操作过程中可以访问,从而允许一种通信方式。