Как вывести ошибку в эффектах из условия takeWhile? - PullRequest
0 голосов
/ 02 мая 2020

У меня есть эффект, который будет что-то делать, если тот же пользователь не нажал, чтобы избежать ненужных запросов, правильно?

Этот код работает, однако, когда он попадает в состояние, когда тот же пользователь уже нажали, снова нажали, это не вызывает никаких ошибок в Магазине, таким образом, не производит никакого следующего эффекта.

Как я могу вернуть ошибку, если мой takeWhile не удовлетворен в моих логиках c?

updatePartial$: Observable<Action> = createEffect(() =>
    this.action$.pipe(
        ofType(fromPeopleActions.UPDATE_MANY_PARTIAL),
        withLatestFrom(this.selectorsService.userFriendClicked),
        takeWhile(([action, userFriendClicked]) => action.updates.id !== userFriendClicked.id),
        switchMap(([action, userFriendClicked]) => {
            console.log('oi');
            const peoples: Update<IPeople>[] = [];
            const https: Observable<Update<IPeople>>[] = [];

            peoples.push(action.updates);
            peoples.push({
                ...userFriendClicked,
                changes: {
                    isClicked: false,
                },
            });

            peoples.forEach((people) => https.push(this.backendService.updatePartial(people)));

            return forkJoin(https).pipe(
                map(() => fromPeopleActions.UPDATE_MANY_PARTIAL_SUCCESS({ updates: peoples })),
                catchError((error) => of(fromPeopleActions.UPDATE_MANY_PARTIAL_FAIL({ error: this.requestHandlerService.getError(error) })))
            );
        })
    )
);

1 Ответ

1 голос
/ 02 мая 2020

Поскольку Rx JS 6.4.0, takeWhile принимает необязательный параметр inclusive, который будет испускать первый элемент, который не прошел предикат.

Однако в В вашем случае вместо последнего неудачного элемента вам нужно выдать ошибку, чтобы она была перехвачена оператором catchError. Одним из обходных путей будет использование concatMap перед takeWhile для того же условия и выдача ошибки в случае сбоя. Попробуйте следующее

updatePartial$: Observable<Action> = createEffect(() =>
  this.action$.pipe(
    ofType(fromPeopleActions.UPDATE_MANY_PARTIAL),
    withLatestFrom(this.selectorsService.userFriendClicked),
    concatMap(([action, userFriendClicked]) => {
      if (action.updates.id !== userFriendClicked.id) {
        return of([action, userFriendClicked]);
      }
      return throwError('Same user clicked');
    }),
    takeWhile(([action, userFriendClicked]) => action.updates.id !== userFriendClicked.id),
    .
    .
...