Rxjs 前3项延迟1秒,第4项延迟4秒

Rxjs 前3项延迟1秒,第4项延迟4秒,rxjs,rxjs6,Rxjs,Rxjs6,我试图显示前3个数字,每个数字延迟1秒,第四个数字延迟4秒。不幸的是,我的代码以1秒的时间显示这四个数字 import { from, of, race, timer, interval } from 'rxjs'; import { groupBy, mergeMap, toArray, map,merge, reduce, concatMap, delay, concat, timeout, catchError, take } from 'rxjs/operators'; const o

我试图显示前3个数字,每个数字延迟1秒,第四个数字延迟4秒。不幸的是,我的代码以1秒的时间显示这四个数字

import { from, of, race, timer, interval } from 'rxjs';
import { groupBy, mergeMap, toArray, map,merge, reduce, concatMap, delay, concat, timeout, catchError, take } from 'rxjs/operators';

const obs$ = from([1,2,3]).pipe(concatMap(a => of(a).pipe(delay(1000)))); 
const obs2$ = of(4).pipe(delay(4000)); 
const result$ = obs$.pipe(merge(obs2$));

const subscribe = result$.subscribe(val => console.log(val));  
它显示 1234|

而不是 123---4|


这个问题完全是为了作为初学者学习rxjs,并且已经在方法1上进行了测试

merge
操作符同时订阅可观察(
obs$
obs2$
。因此,您从代码中获得的结果可以解释如下:

obs$     -----1-----2-----3
obs2$    -----------------------4
result$  -----1-----2-----3-----4
通过将第二个参数设置为1(默认情况下为
Number.POSITIVE _∞
),强制
merge
一次只订阅一个可观察对象,可以实现您的目标,如下所示:

const obs$=from([1,2,3]).pipe(concatMap(a=>of(a).pipe(delay(1000)));
const obs2$=共(4)条管道(延迟(4000));
//将并发(第二个)参数设置为1
const result$=obs$.pipe(合并(obs2$,1));
constsubscribe=result$.subscribe(val=>console.log(val));
方法2

使用
concat
而不是
merge

 const obs$ = from([1, 2, 3]).pipe(concatMap(a => of(a).pipe(delay(1000))));
    const obs2$ = of(4).pipe(delay(4000));
    const result$ = concat(obs$, obs2$);

    const subscribe = result$.subscribe(val => console.log(val));
方法3

否则,您只需使用
concatMap
的第二个参数,它是已发出项目的索引(从0开始)

const obs$=from([1,2,3,4]);
const delayed$=obs$管道(
concatMap((值、索引)=>{
if(index console.log(x));

你的答案非常棒,非常清楚。谢谢你,伙计,你太棒了!我没想到merge会同时订阅这两个可观察对象,但实际上这是合乎逻辑的。