Rxjs mergeMap操作符是如何工作的?

Rxjs mergeMap操作符是如何工作的?,rxjs,rxjs-observables,Rxjs,Rxjs Observables,我试图理解mergeMap在这个示例中是如何工作的,但仍然不理解。你能帮我吗 import { interval } from 'rxjs'; import { mergeMap, take } from 'rxjs/operators'; // emit value every 1s const source$ = interval(1000); source$ .pipe( mergeMap( // project val => interva

我试图理解mergeMap在这个示例中是如何工作的,但仍然不理解。你能帮我吗

import { interval } from 'rxjs';
import { mergeMap, take } from 'rxjs/operators';


// emit value every 1s
const source$ = interval(1000);

source$
  .pipe(
    mergeMap(
      // project
      val => interval(5000).pipe(take(2)),
      // resultSelector
      (oVal, iVal, oIndex, iIndex) => [oIndex, oVal, iIndex, iVal],
      // concurrent
      2
    )
  )
  /*
        Output:
        [0, 0, 0, 0] <--1st inner observable
        [1, 1, 0, 0] <--2nd inner observable
        [0, 0, 1, 1] <--1st inner observable
        [1, 1, 1, 1] <--2nd inner observable
        [2, 2, 0, 0] <--3rd inner observable
        [3, 3, 0, 0] <--4th inner observable
*/
  .subscribe(val => console.log(val));
从'rxjs'导入{interval};
从“rxjs/operators”导入{mergeMap,take};
//每1s发射一次值
常量源$=间隔(1000);
来源$
.烟斗(
合并地图(
//计划
val=>间隔(5000)。管道(取(2)),
//结果选择器
(椭圆形,iVal,oIndex,iIndex)=>[oIndex,椭圆形,iIndex,iVal],
//同时发生
2.
)
)
/*
输出:

[0,0,0,0]让我们将逻辑分解为简单线程:

您的
源$
计时器将发出值0、1、2、3。。。每一秒。该线程通过管道,其中
mergeMap
用于修改线程

并发值
2
意味着每两个输入值将被传递一次,并等待执行完成,然后接下来的2个值将被传递并执行,以此类推

您有选择器:[旧索引,旧值,当前索引,当前值],让我们看看:

  • 第一个值是
    0
    ,来自
    源$
    ,将生成
    [0,0,0,0]
    ,因为传入值是
    0
    ,而
    mergeMap
    间隔(5000)
    的当前值也是
    0
  • 第二个值
    1
    源$
    经过1000毫秒后传递到mergeMap,然后变异为值
    [1,1,0,0]
    ,其中
    0,0
    -作为第一个值和
    间隔(5000)
    的索引。对于每个管道值,将生成新的
    间隔(5000)
  • 5000 ms后,它从
    mergeMap
    1,1
    生成第二个值和索引,因此在值为
    0,0
    的第一个管螺纹中,它生成输出:
    [0,0,1,1]
    。在值为
    1,1
    的第二个管道中,它生成输出
    [1,1,1,1]
  • 现在接下来的两个值从
    源$
    转到
    mergeMap
    2,2
    3,3
    。因此,我们再次使用新的
    间隔(5000)
    0,0
    1,1
    在5000ms后重复这些步骤。因此,它生成
    [2,2,0,0]
    [3,3,0,0]
    ,并在5000毫秒后
    [2,2,1,1]
    [3,3,1,1]

请继续。

非常感谢托尼·马尔科的帮助。我现在了解了mergeMap的工作原理。但是,你忘了提到take(2)。正是(2)解释了为什么内部可观测物体发射的数字永远不会超过1。我认为这是显而易见的:)