2017-09-25 192 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模擬了可觀察對象 - 你可以用你自己的可觀察列表來替換它。