Как обработать условие If-else в Effect, чтобы либо выдать ошибку, либо вернуть ответ из API? - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь проверить условие, на основании которого я либо сгенерирую ошибку, либо продолжу до вызова API, который shd возвращает ответ.Я не уверен, как подойти к этому.

Не очень хорошо в rxjs.новичок учится веревки.Будет ли следующий код достичь этого?то есть, если у меня нет идентификатора пиццы, я хотел бы вызвать другой эффект ошибки, иначе вызовите API, чтобы получить пиццу

getPizzas$ = this.actions$.pipe(
  ofType<GetAllPizzas>(PizzaTypes.GetPizzas,
  withLatestFrom(
    this.store$.pipe(select(fromRootStore.getPizzaId))
  ),
  take(1),
  exhaustMap(([customAction, pizzaId]): any => {  // << assuming this is correct
    if (!pizzaId) {                       
      map(() => new BigProductError({ .   /// <<< is this how we approach this? just map? or should we return something?
           appmessage : "Boom"
      }));
    } .      /// <<< will control go beyond this point or is this more of an if-else condition?
    return this.pizzaService.getPizzas(customAction.orderDetails, pizzaId)
      .pipe(
        map((pizzas) => new LoadPizzasSuccess(pizzas)),
        catchError(error => of(new LoadPizzasFailure(error)))
      );
  })
);```

1 Ответ

1 голос
/ 14 июня 2019

Вы должны выбросить ошибку BigProductError, чтобы подписчики могли ее перехватить, используя catchError().Поскольку он генерируется, для оператора if блок else не требуется.

getPizzas$ = this.actions$.pipe(
  ofType<GetAllPizzas>(PizzaTypes.GetPizzas),
  withLatestFrom(this.store$.pipe(select(fromRootStore.getPizzaId))),
  take(1),
  mergeMap(([customAction, pizzaId]) => {
    if (!pizzaId) {                       
      throw new BigProductError({appmessage : "Boom"}));
    }
    return this.pizzaService.getPizzas(customAction.orderDetails, pizzaId)
      .pipe(
        map((pizzas) => new LoadPizzasSuccess(pizzas)),
        catchError(error => of(new LoadPizzasFailure(error)))
      );
  })
);

Я бы также использовал mergeMap() после take(1), поскольку будет выброшено только одно значение.

...