上下文传播

上下文传播允许将数据附加到 zone。 然后,当数据在异步调用中传播时,数据与 zone 一起传输。

  1. let rootZone = Zone.current;
  2. // Fork rootZone和attach属性
  3. let zoneA = rootZone.fork({name: 'zoneA', properties: {a: 1, b:1}});
  4. // Fork zoneA和attach属性,其中一些覆盖zoneA。
  5. let zoneB = zoneA.fork({name: 'zoneA'[d], properties: {a: 2}});
  6. // 查询zoneA返回预期值
  7. expect(zoneA.get('a')).toEqual(1);
  8. expect(zoneA.get('b')).toEqual(1);
  9. // 查询zoneB返回zoneB定义'a'为2的预期值。
  10. expect(zoneB.get('a')).toEqual(2);
  11. // 查询zoneB的'b'返回zoneA的'b',因为zoneB没有'b'的值。
  12. expect(zoneB.get('b')).toEqual(1);

关键点:

  • 附加到该区域的数据shallow-immutable。 (一旦 zone 被 fork,它的属性不能被改变。)
  • 子 zone 继承父 zone 属性。(在子 zone 中运行的代码应该与在父 zone 中运行的代码相同,前提是子 zone 没有显式覆盖代码所依赖的值。)
  • 因为 zone 流通过异步操作,所以相应的属性与 zone 流允许以某种形式进行通信。