Rx JS - Преобразование событий «Объект» в «Массив», содержащий все объекты - PullRequest
0 голосов
/ 08 апреля 2020

КОНТЕКСТ:

У меня есть конечная точка Websocket. Это WS потоковый набор messages. Каждый message имеет набор данных, к которым я хочу получить доступ для подачи визуализации.

ПРОБЛЕМА:

Визуализация принимает только Arrays. И конечная точка WS имеет только объекты. Я хочу преобразовать отдельные Объекты в массив объектов.

КОД:

  webSocketRequest.onopen = () => {
    webSocketRequest.send(JSON.stringify(firstMessage));
    webSocketRequest.onmessage = (streamEvent) => {

      return of(streamEvent).pipe(
        map(event => JSON.parse(event.data)),
        filter(message => message.type === 'RECORD'), // Here I filter only for the Object I want
        tap(rec => console.log(rec.data.value)) // This returns my desired individual objects
      ).subscribe();
    };
  };

С этого момента я столкнулся со стеной. Может кто-нибудь, помогите мне, пожалуйста? В сущности, я хочу преобразовать все объекты в массив, который содержит их все. Спасибо !!

1 Ответ

1 голос
/ 08 апреля 2020

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

  1. Стремительный подход: создайте массив в вашем потребителе и измените его. это в обратном вызове .subscribe ():
const messages = [];
of(streamEvent)
  .pipe(...your pipe here...)
  .subscribe(message => messages.push(message))

Немного более необычно - вы можете сделать это прямо в своей трубе, и в результате наблюдаемая будет генерировать измененный массив каждый раз, когда добавляется новое сообщение:
of(streamEvent)
  .pipe(
    ...your pipe here...,
    scan((messages, msg) => [...messages, msg], []),
    startWith([])
  )

Это позволяет вам передать это доступно различным конечным потребителям, и они смогут использовать массив по мере его изменения, не дублируя логи c

...