【发布时间】:2018-03-06 08:28:50
【问题描述】:
使用 forkJoin 时,所有项目(在本例中为 HTTP 请求)都会立即发送到服务器,然后作为数组发出:
let observable_array = [observable1, observable2, ...];
Observable.forkJoin(observable_array).subscribe(res => {
console.log('Res: ', res);
}, err => {
console.log('Err: ', err);
});
这对我来说是个问题,因为我使用的是单线程服务器 (NodeJS)。如果observable_array 包含 10 个 HTTP 请求,每个请求需要 3 秒才能完成,则 30 秒内不能发出其他请求。
我正在寻找的是一种执行请求1的方法,等待来自服务器的响应完成,然后执行请求2,然后等待响应等。使用这种方法意味着新请求不会必须等待 30 秒才能完成 observable_array 才能被服务器执行...它们最多只会等待 3 秒。
我想出了以下解决方案,但我相信知识渊博的人会有更优雅的解决方案。
let observable_array = [observable1, observable2, ...];
var queue = function(t, ob) { // Needed to use var instead of let because of scoping...
if (ob) {
ob.subscribe(res => {
console.log('Res: ', res);
queue(t, observables.shift());
}, err => {
console.log('Err: ', err);
});
}
}
queue(this, observables.shift());
【问题讨论】:
-
我不确定他的问题是否相同 - 链接的“重复”不关心并发执行,而 OP 确实关心 - 他只关心按顺序订阅结果。不同的是关心太多并发的http请求...
-
你应该在你的后端寻找一个解决方案,因为如果有人想溢出你的调用堆栈,这很容易......
-
只需使用
concat而不是forkJoin