2017-10-17 40 views
0

我加载数据的方法,然后做设定,在每个数据同步的一些工作:RxJs:如何调用当两个可观察的订阅工作是从不同的API终点完成

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

要做到这一点,您可以使用forkJoin,在那里你把你所有的观测量作为一个数组和它们运行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); 
    }); 

希望这有助于。

+0

嗯,对不起,我不明白。我的订阅()完成后如何获得另一个Observable?我可以添加一个完整的()处理程序。但我不知道该怎么做...... – Knack

+1

哦,我只是用'asyncSimulator'方法模拟一个异步任务,最主要的是'forkJoin'看它是如何调用的,你将你的不同异步进程作为一个数组,然后订阅结果是按照您传递异步过程@Knack的顺序排列的结果数组 –