【问题标题】:What Is the behavior of forkJoin when it is not In a SwitchMap/MergeMap in Epics当 forkJoin 不在 Epics 的 SwitchMap/MergeMap 中时,它的行为是什么
【发布时间】:2019-06-01 01:50:07
【问题描述】:

我想了解当我直接通过管道传递给 action$ 并尝试使用 forkJoin 运算符时会发生什么

const action1 = { type: "ACTION_1" };
const action2 = { type: "ACTION_2" };

在 switchMap forkJoin 中工作正常。



export const testForkJoinSwitchMap: Epic<Action> = action$ =>
  action$.pipe(
    ofType(action1),
    switchMap(() =>
      forkJoin(
        from(fetch("https://api.github.com/users")).pipe(
          map((res: any) => {
            return res;
          })
        )
      )
    ),
    map((data: any) => {
      // do something with data
      return action2;
    })
  );

如果我把它从 switchMap 中取出来:


export const testForkJoin: Epic<Action> = action$ =>
  action$.pipe(
    ofType(action1),
    forkJoin(from(fetch("https://api.github.com/users"))).pipe(
      map((response: any) => {
        return action2;
      })
    )
  );

我输入错误:

Argument of type 'Observable<{ type: string; }>' is not assignable to parameter of type 'OperatorFunction<{}, Action<any>>'.

我想知道为什么它不能编译?以及类型不匹配的原因,是什么让没有forkJoin的史诗在这种情况下无效?

编辑:我知道 forkJoin 对于单个 observable 没有意义,但我放 1 以使示例更小

【问题讨论】:

    标签: rxjs redux-observable


    【解决方案1】:

    observable.pipe() 只包含 operators

    forkJoin 是一个返回 observable 的运算符,这就是您收到该错误的原因。 Argument of type 'Observable' is not assignable to parameter of type 'OperatorFunction' 即返回 observable 的 forkJoin 不能分配给运算符函数的类型。

    另一方面,

    switchMap 是一个返回 OperatorFunction 并对 observable 进行操作的运算符,这就是您的第一种方法有效的原因。 switchMap(() =&gt; someObservable)someObservable 在这种情况下是 forkJoin()

    从您的导入中也可以看出这一点。您可能从 rxjs 库导入了 forkJoin,而从 rxjs/operators 库导入了 switchMap。

    【讨论】:

    • 这对我来说是有道理的,但是根据rxjs-dev.firebaseapp.com/api/index/function/forkJoin,它说 forkJoin 是一个运算符,难道 forkJoin 是一个运算符而不是一个可管道/可出租的运算符吗?我认为 'from' 和 'of' 或者从 'rxjs' 而不是从 'rxjs/operators' 导入的任何东西也是这样?
    • 哦,是的。我应该改写我的答案,即 forkJoin 是一个返回 Observable 的运算符。所以是的,任何从 'rxjs' 导入的运算符都必须返回一个 Observable,尽管我不确定。 switchMap 返回一个 OperatorFunction。
    猜你喜欢
    • 1970-01-01
    • 2018-09-16
    • 2016-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多