Angular 2 - 运行 2 人同时订阅

Angular 2 - Run 2 subscription in the same time

我有以下代码:

//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. 我找不到使用 Promise.All()
  3. 获取每个可观察结果的方法

谢谢

我相信 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 是一个有用的 link,您可以在其中了解有关可观察对象以及如何使用 forkJoin 的更多信息。

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

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(),那就看我之前的回答 :).