2017-09-25 177 views
0

当使用forkJoin所有(在这种情况下,HTTP请求)被发送到服务器瞬间,然后发出一个数组一个单线程服务器(NodeJS)。如果observable_array包含10个HTTP请求,并且每个请求需要3秒才能完成,则可以在30秒内完成其他请求。Angular2 RxJS ForkJoin替代

我正在寻找的是执行请求1,等待服务器的响应来完成的一种方式,然后执行请求2,然后等待响应等使用这种方法意味着新的请求不要” t必须等待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()); 
+3

[可观察到的数组的顺序订阅](https://stackoverflow.com/questions/46388455/sequential-subscription-to-an-array-of-observables) – jonrsharpe

+0

我不确定他的问题是一样的 - 链接的'重复'不关心并行执行,这是OP关心的 - 他只关心顺序订阅结果。所不同的是关心过多并发的HTTP请求...... –

+0

你倒是应该寻找在后端的解决方案,因为如果有人要溢出你调用堆栈这会是容易... – Maxime

回答

0

你可以使用你最喜欢的flatMap/mergeMap风格,并添加一个并发参数。这将限制您正在服务的并发observables /请求的数量。

//emit value every 1s 
const source = Rx.Observable.interval(1000); 

const example = source.mergeMap(
    //project 
    val => Rx.Observable.interval(5000).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 
*/ 
const subscribe = example.subscribe(val => console.log(val)); 

https://www.learnrxjs.io/operators/transformation/mergemap.html

通知的2作为最终的参数限制并发请求到最多两个。显然你可以将它改为1.上面的例子用.interval模拟了可观察对象 - 你可以用你自己的可观察列表来替换它。