2017-09-25 19 views
0

すべての項目(この場合はHTTPリクエストを)forkJoin使用して、瞬時にサーバーに送信され、その後、アレイとして放出されていますAngular2 RxJS ForkJoin代替

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を実行し、レスポンスを待つなどです。このアプローチを使用すると、 observable_arrayがサーバーによって実行されるのが完了するまでに30秒間待たなければなりません...最大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の好みのフレーバーを使用して、並行パラメータを追加できます。これは、あなたが提供している同時観測/要求の数を制限します。 https://www.learnrxjs.io/operators/transformation/mergemap.html

から撮影

//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)); 

両者の最大同時要求を制限するために、最終的なパラメータとして2に注目してください。明らかに、これを1に変更することができます。上記の例は、.intervalの観測値をエミュレートします。これは、あなた自身の観測可能なリストで置き換えるだけです。

関連する問題