Javascript 使用redux observable取消请求不起作用

Javascript 使用redux observable取消请求不起作用,javascript,rxjs,middleware,redux-observable,side-effects,Javascript,Rxjs,Middleware,Redux Observable,Side Effects,我正在尝试使用redux observable在请求中添加取消。尝试实现一个简单的登录示例。目前,我无法在添加取消后再次提交登录请求 const loginUserApiCall = (username, password) => { return new Promise((resolve, reject) => { if (username === "foo" && password === "foo") { resolve({

我正在尝试使用redux observable在请求中添加取消。尝试实现一个简单的登录示例。目前,我无法在添加取消后再次提交登录请求

const loginUserApiCall = (username, password) => {
  return new Promise((resolve, reject) => {
    if (username === "foo" && password === "foo") {
      resolve({
        user: { name: "foo", lastName: "fooLName", email: "foo@gmail.com" }
      });
    }
    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))
    })
  );

当取消未发生并且在取消请求后无法重试时,我做错了什么?一旦用户取消,我应该能够再次重试。

一旦
执行,直到执行
为止,它将完成您的观察,当抛出错误并且整个流被停用时也是如此。您可以在末尾添加
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()
  );

使用switchMap,以便在触发第二个登录请求操作时自动取消上一个请求。