Rxjs mergeMap操作符是如何工作的?
我试图理解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
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。我认为这是显而易见的:)