Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/30.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在RxJS中分块运行一组可观察对象_Javascript_Angular_Rxjs_Rxjs6 - Fatal编程技术网

Javascript 在RxJS中分块运行一组可观察对象

Javascript 在RxJS中分块运行一组可观察对象,javascript,angular,rxjs,rxjs6,Javascript,Angular,Rxjs,Rxjs6,我试图在块中运行一个观察池,并在其间添加一个间隔。我尝试了以下代码: let i = 0; from([].constructor(20)).pipe( concatMap(a => of(i).pipe(delay(1000))), // add a delay mergeMap(obj => of(i++), 5) // run 5 in parallel ).subscribe(res => { console.

我试图在块中运行一个观察池,并在其间添加一个间隔。我尝试了以下代码:

    let i = 0;
    from([].constructor(20)).pipe(
      concatMap(a => of(i).pipe(delay(1000))), // add a delay
      mergeMap(obj => of(i++), 5) // run 5 in parallel
    ).subscribe(res => {
      console.log('done', new Date().toISOString(), res);
    });
现在,这增加了所有可观察到的延迟,因此我得到的输出是:

done 2020-03-25T09:23:34.151Z 0
done 2020-03-25T09:23:35.151Z 1
done 2020-03-25T09:23:36.151Z 2
done 2020-03-25T09:23:37.151Z 3
done 2020-03-25T09:23:38.151Z 4
done 2020-03-25T09:23:39.151Z 5
done 2020-03-25T09:23:40.153Z 6
done 2020-03-25T09:23:41.155Z 7
done 2020-03-25T09:23:42.161Z 8
done 2020-03-25T09:23:43.163Z 9
done 2020-03-25T09:23:44.167Z 10
done 2020-03-25T09:23:45.170Z 11
done 2020-03-25T09:23:46.171Z 12
done 2020-03-25T09:23:47.177Z 13
done 2020-03-25T09:23:48.178Z 14
done 2020-03-25T09:23:49.182Z 15
done 2020-03-25T09:23:50.183Z 16
done 2020-03-25T09:23:51.186Z 17
done 2020-03-25T09:23:52.188Z 18
done 2020-03-25T09:23:53.192Z 19
正如您所看到的,它运行每一个,并增加1秒的延迟。我想实现的是先并行运行5次,然后添加1秒延迟,然后再运行下5次,以此类推

我甚至尝试在管道中交换mergeMap和concatMap顺序,但结果相同


有什么想法吗?

您可以使用
bufferCount
创建批,然后
forkJoin
并行运行它们:

let i = 0;
const createRequest = () => of(i++);

from([].constructor(20)).pipe(
  bufferCount(5),
  concatMap(chunk => forkJoin(chunk.map(createRequest))
    .pipe(delay(1000)) // add a delay
  ),
).subscribe(res => {
  console.log('done', new Date().toISOString(), res);
});

现场演示:

subscribe()
中使用
complete
处理程序,就像
subscribe({next:res=>…,complete:()=>console.log('all done')}
一样,只不过考虑到forkjoin不会等待
createRequest
完成,如果这是一项耗时的任务。
forkJoin
始终等待其所有源观测完成。