2017-10-17 13 views
0

を行う場合にメソッドを呼び出すために、私は別のAPIエンドポイントからのデータをロードし、各データセットにいくつかの同期作業を行うよ:RxJs:どのように2回の観測のサブスクリプションでの作業が

// Invoked by user interaction 
loadData() { 
    this.service1.getData().subscribe(
     data => { 
     this.doSynchronousWork(data); 
     this.data1 = data; 
     } 
    ); 

    this.service2.getData().subscribe(
     data => { 
     this.doSynchronousWork(data); 
     this.data2 = data; 
     } 
    ); 
} 

// To be invoked when this.data1 and this.data2 is available 
doSynchronousWorkWhenAllDataIsLoadedAndProcessed() 

は今、私が呼び出す必要があります両方のサブスクリプションが作業を完了したときに別の同期メソッド。どうやってやるの?これを実現するために

答えて

3

、あなたは配列として、すべての観測を追加し、彼らはasynchronuouslyそう

import { Observable} from 'rxjs/Observable'; 
import 'rxjs/add/observable/forkJoin'; 

console.log("Owk ooo let's play small with observables "); 

// this is just to form an asynchronous process 
asyncSimulator(data: number): Observable <any> { 
    return Observable.create(observer => { 
    setTimeout(() => { 
     observer.next("data to send can be object or anything" + data); 
     console.log("am done"); 
     observer.complete(); //to show we are done with our processing 
    }, 2000); 
    }) 
} 

/** 
call the all asynchronous process here, like so with Fork Join 
*/ 
Observable.forkJoin([ 
    this.asyncSimulator(1), 
    this.asyncSimulator(2), 
    this.asyncSimulator(3), 
    ]) 
    .subscribe(results => { 
    let async1 = result[0]; 
    let async2 = result[1]; 
    let async3 = result[1]; 
    console.log("results is an array", results); 
    }); 

・ホープ、このことができますように配列としてデータを返す実行forkJoinを、使用しています。

+0

申し訳ありませんが、私はそれを取得しません。私のsubscribe()が終了した後、もう一つのObservableを取得するには? complete()ハンドラを追加することができます。しかし、私はその中で何をするべきではありません... – Knack

+1

ああ、 'asyncSimulator'メソッドで非同期タスクをエミュレートしています、主なものは' forkJoin'です。どのように呼び出されたかを見て、別の非同期プロセスを配列を作成し、サブスクライブ結果は非同期プロセスを渡した順に結果の配列@Knack –

関連する問題