Отменить запрос с использованием избыточного наблюдаемого не работает

Я пытаюсь добавить отмену в свой запрос, используя redux-observable. Попытка реализовать простой пример входа в систему. В настоящее время я не могу снова отправить запрос на вход после того, как добавил отмену.

const loginUserApiCall = (username, password) => {
  return new Promise((resolve, reject) => {
    if (username === "foo" && password === "foo") {
      resolve({
        user: { name: "foo", lastName: "fooLName", email: "[email protected]" }
      });
    }
    reject({ err: "Creds are incorrect" });
  });
};

const loginRequestEpic = (action$, state$) =>
  action$.pipe(
    ofType(LOGIN_REQUEST),
    mergeMap(action => {
      const { username, password } = action.payload;
      return loginUserApiCall(username, password);
    }),
    mergeMap(res => of(loginSuccess(res))),
    takeUntil(action$.pipe(ofType(LOGIN_CANCELLED))),
    catchError(err => {
      return of(loginFailure(err))
    })
  );

Что я делаю неправильно, поскольку отмена не происходит, и я не могу повторить запрос после его отмены? Как только пользователь отменит, я смогу повторить попытку снова.


person fscore    schedule 27.11.2018    source источник
comment
используйте switchMap, чтобы предыдущий запрос автоматически отменялся при запуске второго действия LOGIN_REQUEST.   -  person Praveen    schedule 11.12.2018


Ответы (1)


Как только takeUntil будет выполнен, он завершит вашу наблюдаемую, так же как и при возникновении ошибки, и весь поток деактивируется. Вы можете добавить оператор repeat в конец

  action$.pipe(
    ofType(LOGIN_REQUEST),
    mergeMap(action => {
      const { username, password } = action.payload;
      return loginUserApiCall(username, password);
    }),
    mergeMap(res => of(loginSuccess(res))),
    takeUntil(action$.pipe(ofType(LOGIN_CANCELLED))),
    catchError(err => {
      return of(loginFailure(err))
    }),
    repeat()
  );
person Fan Cheung    schedule 27.11.2018