2017-07-20 6 views
0

私は値の配列を持つシチューテーションを持っています。配列から関数へのRxJSの観測値の連結

これらの変数のそれぞれについて、私は観察可能なものを呼び出したいが、以前の観察可能なものが完了した後にのみ行う。

さらに「RxJS」の方法はありますか?

let num = 0; 

    let myObs = new Observable(observ => { 
    observ.next(1); 
    }) 
    let content=['x','y','z']; 

    myObs.subscribe(data => { 
    let i = 0; 
    let that = this; 
    let inlineFunc = function(){ 
     if (i < content.length){ 
     that.gen(num).subscribe(() => { 
      i++; 
      inlineFunc(); 
     }); 
     }else{ 
     observer.next(doc); 
     } 
    }; 
    inlineFunc(); 
    }); 

    gen(num:number) : Observable <any>{ 
    return num*num; 
    }, 
+0

https:// stackoverflowを参照してください。com/documentation/rxjs/8247/common-recipes/28035/sending-multiple-sequential-http-requests#t = 201707201552565074693 – martin

答えて

0

あなたが継続的に繰り返しobservableを起動したい場合は、Observable.expand()を使用することができます。

は、コンテンツの配列があるとします。

let content=['x','y','z']; 

やコンテンツ内の各値のために、あなたが観察を返すgen()機能を呼び出すしたい:

gen(num: number): Observable<any> { 
    return Observable.of(num * num); 
} 

何行うことができます

let myObs = Observable.of(1); 
let num = 0; 
let content = ['x','y','z']; 

const gen = (num: number): Observable<any> => { 
    return Observable.of(num * num); 
} 

myObs 
.expand(()=>{ 
    return gen(num); 
}) 
.skip(1) 
.take(content.length) 
.subscribe(x=>console.log(x)); 

説明:

  1. .expand()あなたが彼に止めるように依頼するまで、反復的に関数パスを(第1引数として)呼び出します。この場合、それは

  2. .skip(1)(観測可能を返す)gen()を呼び出しますあなたのmyObsが値1

  3. .take()で観察される第一の発光をスキップすることで永遠に続け.expand()を終了することです。ここでは、contentの長さだけ繰り返すことができます。

  4. .subscribe()結果を得るために。

コメント:あなたのnum私はgen()を想定しています0ですので、あなたが本当返すいくつかの観測で置き換えられますちょうどいくつかのダミー関数である

0 
0 
0 
0 

:あなたは次のような出力が得られます意味のあるデータ。

あなたが最初のオペレータから使用して値を観測可能を取得し、削減使用することができますJSBin

0

作業、

Observable.from([...values]) 
    .reduce(this.reducingFn, 1) 

reducingFunctionは、2つのパラメータを受け付ける関数であり、最初は開始値であります(reduce関数の2番目のパラメータ)、2番目の値は外側のストリームによって出力された現在の値です(values配列の各値)

// somewhere in you class 
reducingFn(accumulatedValue, value){ 
    return accumulatedValue * value 
} 
関連する問題