Плагин диспетчерского декоратора NGXS не работает с withLatestFromOperator

Я использую NGXS в качестве управления состоянием вместе с его плагином https://github.com/ngxs-labs/dispatch-decorator

На моем компоненте есть следующий код:

this.route.paramMap.pipe(
  tap((params: ParamMap) => {
    this.facade.initializeForm();
  }),
  switchMap((params: ParamMap) => {
    const id = +params.get('id');
    return of(this.facade.viewOrder(id));
  }),
  withLatestFrom(this.facade.currentlyViewedDelivery$),

).subscribe((delivery) => {
  console.log('DELIVERY', delivery);
});

это мой viewOrder ():

  @Dispatch() viewOrder = (id: number) => new OrderAction.View(id);

Однако результаты моей подписки говорят мне, что в настоящее времяViewedDelivery $ возвращает значение null. Когда я пробовал оператор delay () перед withLatestFrom (), он работал. Это дает мне представление о том, что действие отправки еще не завершено. Однако, когда я попробовал обычную отправку с помощью Store, он работал без использования delay (). В чем может быть проблема?

Спасибо!


person iamjc015    schedule 20.11.2019    source источник


Ответы (1)


Я не уверен, чего вы пытаетесь достичь, но декоратор @Dispatch не следует так использовать.

Что делает этот плагин? По сути, он переопределяет ваш метод, принимает его возвращаемое значение (это должно быть одно действие, Observable или Promise), разворачивает его (подписывает или разрешает Promise) и вызывает dispatch под капотом для вас.

Я предполагаю, что обработчик действия View выполняет некоторую асинхронную работу, поэтому вы видите обновленное значение состояния, когда вы выполняете конвейерную передачу с оператором delay.

Честно говоря, вы должны слушать завершение действия View, см. Код ниже:

this.route.paramMap
  .pipe(
    tap((params: ParamMap) => {
      this.facade.initializeForm();
    }),
    switchMap((params: ParamMap) => {
      const id = +params.get('id');
      this.facade.viewOrder(id);
      return this.actions$.pipe(ofActionSuccessful(OrderAction.View), take(1));
    }),
    withLatestFrom(this.facade.currentlyViewedDelivery$)
  )
  .subscribe(delivery => {
    console.log('DELIVERY', delivery);
  });

Где actions$ - внедренный Actions класс.

Если вы предпочитаете использовать фасады, вы можете просто переместить эту логику в какой-нибудь метод фасада и назвать этот метод чем-то другим :)

person overthesanity    schedule 20.11.2019
comment
Я попробую и дам знать :) Большое спасибо. Не думал об использовании action $ :) - person iamjc015; 21.11.2019