2016-10-28 4 views
0

У меня есть следующий код:Угловой 2 - подписка Run 2 в то же время

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

Благодаря

ответ

1

Это создает две наблюдения, которые завершаются после 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(), то видеть мой предыдущий ответ Observable.forkJoin() doesn't executes :).

+0

Как получить выходные данные для каждого наблюдаемого? 'val' - массив с каждым наблюдаемым выходом? – TheUnreal

+0

@TheUnreal Оператор 'merge()' испускает значения из всех Observables, которые он получает как аргумент, поэтому вызывающий вызов в '.subscribe()' будет вызываться для каждого ответа. – martin

+0

Это проблема, так как мне нужно получить и использовать вывод каждого из них, и с помощью этого метода «merge» я не могу определить, какой наблюдаемый будет загружен каждый вывод, не так ли? Например, мне нужно сохранить в переменной 'user' первые данные наблюдаемых и переменную' role' для второй. – TheUnreal

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 полезная ссылка, где вы можете узнать больше о наблюдаемых и как использовать forkJoin.

+0

Ну, я попробовал это в своем предыдущем посте, http://stackoverflow.com/questions/40303012/observable-forkjoin-doesnt-executes – TheUnreal

+0

Отличный ответ :) –

Смежные вопросы