Проблема с оператором сканирования RX JS | Пропуск ранее накопленных значений - PullRequest
0 голосов
/ 11 января 2020

У меня есть два потока. Поток A и B. Поток B зависит от потока A и, как ожидается, будет накапливать значения, излучаемые потоком A с течением времени. Я использую оператор сканирования для достижения этой цели. Однако проблема заключается в том, что всякий раз, когда поток A выдает значение, оператор сканирования в потоке B всегда начинается со значения по умолчанию, а не с ранее накопленных значений. Поэтому мой вывод всегда основан на текущем ответе, и я теряю эти значения, как только появляется новое значение.

Поток A основан на нашем пользовательском интерфейсе. У меня есть две вкладки и форма ввода, где пользователь отправляет идентификатор учетной записи. Мне нужно как имя вкладки, так и выбранный вход. Я не уверен, что мне не хватает в этом. Если у кого-то есть какие-либо предложения, это будет высоко оценено. Код указан ниже

  private streamA$ = this.selectedTab$.pipe(
    switchMap((tab) =>
      this.accountSubmitted$.pipe(
        switchMap(({ account, type }) => {
          return this.myHttpService.method.pipe(
            map((response) => {
              return {
                type,
                response
              };
          })
        );
      })
    )
  ),
 share()
);

private streamB$ =  this.streamA$.pipe(
  map(({ type, response }) => {
    const { graph } = response;
    return { type, graph };
  }),
  scan((accResponse, currentResponse) => {
    const { type, graph: linkedDetails } = currentResponse;
    const { nodes: newNodes = [], edges: newEdges = [] } = linkedDetails;
    if (type === 'init') {
      return {
        nodes: newNodes,
        edges: newEdges
      };
    }

    const { nodes: linkedNodes = [], edges: linkedEdges = [] } = accResponse;
    const allNodes = [...linkedNodes, ...newNodes];
    const allEdges = [...linkedEdges, ...newEdges];
    return {
      nodes: allNodes,
      edges: allEdges
    };
  }, {})
 );

1 Ответ

0 голосов
/ 12 января 2020

Если кто-то смотрит на подобную проблему, в моем случае проблема не была в потоке. Поток работает нормально, как и ожидалось. Основная проблема была в пользовательском интерфейсе. У меня был экран загрузчика в блоке ngIf & else, который показывает экран загрузки при каждом новом вызове http и мой компонент вместе с файлом asyn c, когда у меня был ответ. Поскольку мой компонент искажался / удалялся из пользовательского интерфейса при каждом вызове http, он регистрировался и снова подписывался каждый раз. Следовательно, отклик аккумулятора (ранее накопленный) всегда был

{}

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

Надеюсь, это кому-нибудь поможет.

Счастливое обучение

Вацал

...