Reactjs 使用redux观测值和RxJS在获取epic期间重定向

Reactjs 使用redux观测值和RxJS在获取epic期间重定向,reactjs,rxjs,react-router,redux-observable,connected-react-router,Reactjs,Rxjs,React Router,Redux Observable,Connected React Router,我有一个fetchepic,如果用户不能访问服务器端资源,它可能会返回401或403。如果是这样的话,我想在史诗中重定向 现在我正在这样做: export const fetch$ = <T = any>(req: IRequest) => from(performFetch<T>(req)).pipe( switchMap(res => of(res)), catchError(e => {

我有一个fetchepic,如果用户不能访问服务器端资源,它可能会返回401或403。如果是这样的话,我想在史诗中重定向

现在我正在这样做:

export const fetch$ = <T = any>(req: IRequest) =>
    from(performFetch<T>(req)).pipe(
        switchMap(res => of(res)),
        catchError(e => {
            if (e.status === 401 || e.status === 403) {
                window.location.replace(`/login?fwd=${encodeURIComponent(window.location.pathname)}`);
                return NEVER;
            }
            return of(e);
        })
    );

export const fetch$=(请求:IRequest)=>
来自(性能蚀刻(要求))管道(
开关映射(res=>of(res)),
捕捉错误(e=>{
如果(e.status==401 | e.status==403){
replace(`/login?fwd=${encodeURIComponent(window.location.pathname)}`);
永不回头;
}
归还(e);
})
);
其中,
performFetch
只是一个简单的函数,它执行获取并返回承诺

我正在使用
window.location.replace
,到目前为止,它工作正常,但有人告诉我它会搞砸

我尝试使用
connected react router
并返回
push
操作,但它没有执行重定向


我可以继续这样做吗,或者有更好的方法吗?

应该不需要使用
窗口。位置。更换
,以便您已经安装
react router
connected react router
,它处理应用程序中的组件导航

可以考虑使用<代码>替换< /代码>或<代码>推< /代码> .< 如果希望返回操作,则必须使用运算符将其包装

import { replace } from 'connected-react-router'.

export const fetch$ = <T = any>(req: IRequest) =>
  from(performFetch<T>(req)).pipe(
    switchMap(res => of(res)),
    catchError(e => {
      if (e.status === 401 || e.status === 403) {
        of(replace(`/login?fwd=${encodeURIComponent(window.location.pathname)}`));
      }
      return of(e);
    })
  );

不需要使用
窗口.位置.更换
,因为您已经安装了
反应路由器
连接的反应路由器
,它处理应用程序中的组件导航

可以考虑使用<代码>替换< /代码>或<代码>推< /代码> .< 如果希望返回操作,则必须使用运算符将其包装

import { replace } from 'connected-react-router'.

export const fetch$ = <T = any>(req: IRequest) =>
  from(performFetch<T>(req)).pipe(
    switchMap(res => of(res)),
    catchError(e => {
      if (e.status === 401 || e.status === 403) {
        of(replace(`/login?fwd=${encodeURIComponent(window.location.pathname)}`));
      }
      return of(e);
    })
  );

这不起作用,可能是因为我的其他代码。我可以看到我的状态树中有路由器,就在那里。你举的第二个例子似乎没有什么作用。第一个返回一个动作,但是我的另一个epic调用fetch$捕获了它,它认为动作就是fetch响应。。在这种情况下,第一个示例可能会使您更接近某个方面。你所说的其他代码中发生了什么?这不起作用,可能是因为我的其他代码。我可以看到我的状态树中有路由器,就在那里。你举的第二个例子似乎没有什么作用。第一个返回一个动作,但是我的另一个epic调用fetch$捕获了它,它认为动作就是fetch响应。。在这种情况下,第一个示例可能会使您更接近某个方面。你所说的其他代码中发生了什么?