Как прикрепить значения к контексту выполнения?

Представьте, что у вас есть глобальный "контекст выполнения" для ведения журнала (сравнимый с MDC) и два вида триггеров, таких как взаимодействие с пользователем и подключение через веб-сокет.

У нас есть служба ведения журнала, которая использует "контекст выполнения" для сообщений журнала.

Пользователь нажимает на кнопку, служба получает контекст, запускается http-запрос, и результат интерпретируется, включая ведение журнала.

Тем временем мы получаем сообщение через веб-сокет, и нам нужно его также интерпретировать. Таким образом, мы устанавливаем наш "контекст выполнения" и перезаписываем существующий в сервисах.

Проблема заключается в том, что сообщения журнала получат тот же контекст выполнения, если наблюдаемый веб-сокет будет запущен до получения результата http.

Есть ли возможность иметь собственный контекст выполнения для нескольких наблюдаемых?
Я думал об использовании NgZone (zone.js) для этого, но я не нашел никакого способа для сохранения контекста.

1 ответ

Вы можете использовать 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');
    });
  });
}

вот плункер, я не уверен, каково ваше требование, плункер просто покажет, как делиться данными. https://plnkr.co/edit/xHZbs1Zb04CbM73ydSYR?p=preview

Другие вопросы по тегам