Javascript 如何格式化RxJS redux可观察史诗来做很多事情?

Javascript 如何格式化RxJS redux可观察史诗来做很多事情?,javascript,rxjs,redux-observable,Javascript,Rxjs,Redux Observable,这是我此刻的史诗 export const listenToNewDataAdded = (action$, store) => action$.pipe( ofType('FIRED_ACTION'), mergeMap((action) => { if (store.value.user === 1) { const someData = {data: 'data'}

这是我此刻的史诗

export const listenToNewDataAdded = (action$, store) =>
    action$.pipe(
        ofType('FIRED_ACTION'),
        mergeMap((action) => {
            if (store.value.user === 1) {
              const someData = {data: 'data'}
                ajax.post(
                    url,
                    someData,
                    { 'Content-Type': 'application/json' },
                )
                return [addNotification(someData)]
            }
            if (store.value.user === 2) {
                const someData = {data2: 'data2'}
                return [addNotification(someData)]
            } else {
                return EMPTY
            }
            catchError((error) => console.log('e:', error))
        }),
    )
我有几个问题。首先,如何在RxJS中正确地发出ajax请求?我正在导入正确的模块,但它没有启动。我想我看到一些文档说要将其返回到隐式返回,但这样我就无法运行下面的代码了

其次,
catchError
表示无法访问的代码。这是有道理的,因为我有覆盖上述案例的所有返回,但我如何捕捉错误?文档中说,确保您在
mergeMap
中捕捉到它,否则如果您在管道中捕捉到它,它将终止epic


关于如何最好地做到这一点,您有什么想法吗?

与其将
catchError
RxJS操作符嵌套在
mergeMap
中,不如将其用作您为
listenToNewDataAdded
epic设置的可管道操作符的一部分

此外,在redux observables中使用
catchError
操作符时,必须发出动作。你可以在上面读到更多关于这方面的内容

以下是您可以修复它的方法:

export const listenToNewDataAdded = (action$, store) =>
    action$.pipe(
        ofType('FIRED_ACTION'),
        mergeMap((action) => {
          // handle logic here 
        }),
        catchError((error) => {
          console.log('e:', error);
          // emit redux action here
          return errorHandlerAction;
        })
    )
export const listenToNewDataAdded=(action$,store)=>
动作$.pipe(
ofType('FIELED_ACTION'),
合并映射((操作)=>{
if(store.value.user==1){
const someData={data:'data'}
返回ajax.post(
网址,
一些数据,
{'Content-Type':'application/json'},
).烟斗(
映射到([addNotification(someData)])
);
}
if(store.value.user==2){
const someData={data2:'data2'}
返回[addNotification(someData)];
}否则{
返回空;
}
}),
//必须返回一个可观察的
catchError((error)=>of('err'))
);
您以前使用的
catchError
方法根本没有效果。它是一个可管道化操作符,还请注意,传递给它的回调函数必须返回一个可观察的/

我正在导入正确的模块,但它没有启动


您可以使用其他操作符修改
ajax
返回的可观测值。它的重要方面是确保您返回可观察对象,以便
mergeMap
可以订阅它并传递其值。

嘿,我的回答解决了您的问题吗?嘿@wentjun对不起,我忘了标记它了!我用同样的解决方案在同一时间解决了这个问题,但我会把你的答案标记为正确,并放弃投票。可以自由地回报;)