如何格式化 RxJS redux observable epic 来做很多事情?

How to format RxJS redux observeable epic to do many things?

这是我此刻的史诗

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 请求?我正在导入正确的模块,但它没有触发。我想我看到一些文档说 return 它隐含地 return 但是我不能 运行 下面的代码?

其次,catchError 表示无法访问代码。这是有道理的,因为我有所有 returns 涵盖上述情况,但我如何捕获错误?文档说确保你在 mergeMap 中捕获它,否则如果你在管道中捕获它,那么它将终止史诗

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

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

此外,在redux-observables中使用catchError运算符时必须发出一个动作。您可以在 here.

上阅读更多相关信息

这是解决问题的方法:

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) =>
  action$.pipe(
      ofType('FIRED_ACTION'),
      mergeMap((action) => {
          if (store.value.user === 1) {
            const someData = {data: 'data'}
              return ajax.post(
                  url,
                  someData,
                  { 'Content-Type': 'application/json' },
              ).pipe(
                mapTo([addNotification(someData)])
              );
          }
          if (store.value.user === 2) {
              const someData = {data2: 'data2'}
              return [addNotification(someData)];
          } else {
              return EMPTY;
          }
      }),
      // Must return an observable
      catchError((error) => of('err'))
  );

您之前使用的方式catchError完全没有效果。它是一个 pipeable operator 并且还要注意传递给它的回调函数 必须 return 一个可观察的 /

I'm importing the right module but it's not firing...

您可以使用其他运算符修改 ajax 编辑的可观察对象 return。它的重要方面是确保您 return observable,以便 mergeMap 可以订阅它并传递它的值。