想象一下,您有一个用于日志记录的全局“执行上下文”服务(与MDC相当)以及两种触发器,如用户交互和Web套接字连接。
我们有一个记录器服务,它使用“执行上下文”来记录日志消息。
用户按下按钮,服务获取上下文,将触发http请求并解释结果,包括记录。
与此同时,我们通过websocket接收消息,并且还需要解释它。因此,我们设置“执行上下文”并覆盖服务中的现有上下文。
问题是如果在收到http结果之前触发websocket observable,日志消息将获得相同的执行上下文。
是否有可能为多个observable提供自己的执行上下文? 我正在考虑使用NgZone(zone.js),但我找不到任何存储上下文的方法。
答案 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