Angular 2 - 同时运行2个订阅

时间:2016-10-28 19:21:27

标签: angular rxjs observable rxjs5

我有以下代码:

//Subscription 3: role ID to role Name
        af.database.object('/roles/'+businessRole.$value)
        .subscribe((roleData) => {
        //Subscription 4: Get user info
        af.database.object('/users/'+businessRole.$key).subscribe(user => {

其中包含订阅内的订阅。

这里的问题是应用程序在运行第二个之前等待第一个应用程序。我想一次执行它们,并得到每个的结果。我怎么能这样做?

之前我一直在使用Promise.All()但是:

  1. 我很想知道如何用rxjs
  2. 做到这一点
  3. 我找不到使用Promise.All()
  4. 获取每个observable结果的方法

    由于

2 个答案:

答案 0 :(得分:4)

我相信Observable.forkJoin正是你需要在你的情况下使用的。

这是你的代码使用forkJoin的样子:

Observable.forkJoin(
this.http.get('/roles/'+businessRole.$value).map((response: Response) => res.json()),
this.http.get('/users/'+businessRole.$key).map((response: Response) => res.json())
).subscribe(data => {
  data[0] // this will contain roleData
  data[1] // this will contain user
},
error => console.log(error));

This是一个有用的链接,您可以在其中了解有关observable以及如何使用forkJoin的更多信息。

答案 1 :(得分:1)

这会创建两个在1000毫秒和900毫秒后完成的Observable。当你运行这个演示时,你会看到第一个完成第一个演示后,在第一个演示之后,证明我们并行执行了这些演示。

let obs1 = Observable.of('HTTP Response 1').delay(1000);
let obs2 = Observable.of('HTTP Response 2').delay(900);

console.log('Start');

obs1.merge(obs2)
    .subscribe(val => console.log(val), undefined, () => console.log('Completed'));

查看现场演示:http://plnkr.co/edit/hzmpclxDkIhnfTYcWXd5?p=preview

打印到控制台:

Start
HTTP Response 2
HTTP Response 1
Completed

如果您需要forkJoin(),请参阅我之前的回答Observable.forkJoin() doesn't executes:)。