如何将值附加到执行上下文?

时间:2017-03-17 10:02:36

标签: angular zone.js

想象一下,您有一个用于日志记录的全局“执行上下文”服务(与MDC相当)以及两种触发器,如用户交互和Web套接字连接。

我们有一个记录器服务,它使用“执行上下文”来记录日志消息。

用户按下按钮,服务获取上下文,将触发http请求并解释结果,包括记录。

与此同时,我们通过websocket接收消息,并且还需要解释它。因此,我们设置“执行上下文”并覆盖服务中的现有上下文。

问题是如果在收到http结果之前触发websocket observable,日志消息将获得相同的执行上下文。

是否有可能为多个observable提供自己的执行上下文? 我正在考虑使用NgZone(zone.js),但我找不到任何存储上下文的方法。

1 个答案:

答案 0 :(得分:0)

你可以使用zone.js来做到这一点。您需要创建自己的zoneSpec来存储您自己的上下文对象。 在按钮单击事件处理程序中。

<button (click)="clicked()">Click</button>

clicked() {
  Zone.current.fork({
    name: 'context',
    properties: {
      context: YOUR_OWN_CONTEXT_OBJECT
    }
  }).run(()=> {
    yourService.getData().subscribe(data => {
      // you can access the context like this.
      const context = Zone.current.get('context');
    });
    webSocket.on('message', function(data) {
      // you can access the context like this.
      const context = Zone.current.get('context');
    });
  });
}

这里是plunker,我不确定你的要求是什么,plunker只是展示如何共享数据。 https://plnkr.co/edit/xHZbs1Zb04CbM73ydSYR?p=preview