如何在Angular 4中使用Observable的运算符forkJoin

时间:2018-03-07 14:16:42

标签: angular typescript rxjs observable

我需要做以下事情:

在此案例街道"用户"中获取相同集合的用户管理员和专业人员,我正在使用最新版本的AngularFire,这适用于此Observables。

如何并行提出两个请求,答案是管理员和专业用户的联合。

我尝试使用forkJoin运算符,如下所示:

 getUsers(): Observable<any> {
  return forkJoin([
    this.afs.collection('users', ref => ref.where('roles.admin', '==', true)).valueChanges(),
    this.afs.collection('users', ref => ref.where('roles.professional', '==', true)).valueChanges()
  ])
  .map((data: any) => {
    console.log(data)
    return data;
  });

}

但是没有执行,我称之为方法:

   this.userSrv.getUsers()
    .subscribe((res) => {
      console.log(res);
    });

这些是我的进口商品:

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

还有其他方法可以做到这一点。 我很感激你的帮助

2 个答案:

答案 0 :(得分:1)

我认为问题在于.valueChanges()会返回‘hot’ observable,而complete永远不会getUsers(): Observable<any> { return Observable.combineLatest( this.afs.collection('users', ref => ref.where('roles.admin', '==', true)).valueChanges(), this.afs.collection('users', ref => ref.where('roles.professional', '==', true)).valueChanges() ) .map((data: any) => { console.log(data) return data; }); } 。并从forkjoin docs

  

等待Observables完成,然后将它们组合起来   射出。

所以你要找的可能是.combineLatest()

distrib(i) = round(cumprobab(i)*255);

每当更新任何一个集合时,这应该记录一个表示两个集合的两个项目的数组。

答案 1 :(得分:0)

尝试类似:

let url1 = this.http.get('https://url1');
let url2 = this.http.get('http://url2');

forkJoin([url1, url2]).subscribe(results => {
  // results[0] is url1 response
  // results[1] is url2 response
  this.url1reponse = results[1];
  this.url2reponse = results[0];
});