RxJs
2025-07-18 10:13:49 0 举报
rxjs中mergeMap,switchMap,concatMap,exhaustMap
作者其他创作
大纲/内容
X
0
2
Ob1
完成complete
5000ms
订阅subscribe
2000ms+5000ms
3
Ob2
Observable
由于concatMap的性质,第7000msOb1结束时Ob2已经映射并挂载在等待区等待执行
映射create
1
合并为一个OB
Ob3
注意如果将switchMap的delay时间改为2000后,在代码层面外部源数据到达的时间和Ob1执行的时间一致,这时候实际上结果并不受影响。1.这里rxjs判断当前Ob是否已经执行结束是根据switchMap内部维护的状态变量,这些变量在不同的回调内会更改,只有执行了当前Ob的complete回调才会将状态锁更改。2.但是由于JS的事件循环机制,外部数据源的of(1).pipe(delay(3000))是的0秒就安排了第3秒的定时器,而switchMap内部的of(1).pipe(delay(2000))是在1秒安排的第三秒定时器,所以外部数据源优先级会更高,而此时当前Ob1的状态还未改变。定时器在JS上属于宏任务
1000ms
4000ms
虽然代码层面两个时间一致,但是由于源数据在0秒就安排了定时器,而Ob2是在第3秒才安排了第4秒的定时器,所以源数据拥有更高的优先级,此时Ob2还为完全结束,所以值3会被忽略掉
3000ms
2000ms
注意1.mergeMap内部为并发进行,默认不限制数量
源数据interval(2000)
取消unsubscribe
...
取消当前Ob和订阅新的Ob这个过程几乎是个原子操作,在同一个微任务中完成,但是底层逻辑是先取消,再订阅
源数据第1秒发射0第3秒发射1
font color=\"#e74f4c\
result
由于concatMap的性质,第12000msOb2结束时Ob3已经映射并挂载在等待区等待执行
执行subscribe
switchMapmergeMapconcatMap...
源数据
3000ms+1000ms
4000ms+5000ms
6000ms
源数据interval(1000)
1000ms+1000ms
3000ms+5000ms
6000ms+5000ms
subscribe
0 条评论
下一页