pipe() 内的 switchMap VS switchMap 的序列

Mat*_*att 5 rxjs

我不明白这之间是否有区别:

Observable.pipe( 
           switchMap((res) => {
             ...
            }),
            switchMap((res) => {
             ...
            })
);
Run Code Online (Sandbox Code Playgroud)

和这个:

Observable.pipe(
            switchMap((res) => {
             ...
            }).pipe(
                 switchMap((res) => {
                 ...
                 }),
            )
  );      
Run Code Online (Sandbox Code Playgroud)

您能否帮助我了解数据处理方式是否存在差异?

谢谢

Avi*_* P. 5

正如所写的,没有什么区别,但是如果您以后想在管道中添加更多项目,这可能很重要。例如catchError- 在第一种情况下,如果将其添加到管道的末尾,那么它将捕获管道的任一步骤引发的错误,但在第二个示例中,您可以将其放在第一个管道内,在内部管道之后switchMap它只会捕获内部操作的错误。

哦,我刚刚读了@serrulien的评论,他是对的,你的第二个管道不能放在你放置它的地方,它会被放在第一个管道的主体内switchMap,例如:

Observable.pipe(
  switchMap((res) => {
    return someObservable().pipe(
      switchMap((res) => {
        ...
      })
  })
);     
Run Code Online (Sandbox Code Playgroud)

俗话说,剥猫皮有多种方法。


Mrk*_*Sef 5

RxJS#pipe 只是函数组合的翻转。事实证明(就像加法一样),组合是结合性的。

\n
\n

对于加法:
\nx + (y + z) = (x + y) + z

\n

对于组合:
\nx \xe2\x88\x98 (y \xe2\x88\x98 z) = (x \xe2\x88\x98 y) \xe2\x88\x98 z

\n
\n

这是什么意思?嗯,您可以将管道函数视为数学方程中的括号。

\n

这些都是相同的表达式,只是括号位于不同的位置:(并且由于管道 RxJS 运算符是关联的,因此括号在哪里并不重要)

\n
// 1\nstream.pipe(\n  switchMap(/*...*/),\n  concatMap(/*...*/),\n  delay(/*...*/),\n  toArray()\n);\n\n// 2\nstream.pipe(\n  switchMap(/*...*/),\n  concatMap(/*...*/)\n).pipe(\n  delay(/*...*/),\n  toArray()\n);\n\n// 3\nstream.pipe(\n  switchMap(/*...*/)\n).pipe(\n  concatMap(/*...*/)\n).pipe(\n  delay(/*...*/)\n).pipe(\n  toArray()\n);\n
Run Code Online (Sandbox Code Playgroud)\n