可观察的forkJoin没有开火

时间:2017-03-15 12:23:36

标签: angular typescript rxjs rxjs5

我试图在两个Observable上使用forkJoin。其中一个以流形式开始...如果我直接订阅它们,我会得到一个回复​​,private data$: Observable<any[]>; private statuses$: Observable<any[]>; private queryStream = new Subject<string>(); .... this.data$ = this.queryStream .startWith('') .flatMap(queryInput => { this.query = queryInput return this._companyService.getCompanies(this.queryRequired + ' ' + this.query, this.page, this.sort); }) .share(); ... Observable.forkJoin(this.statuses$, this.companies$) .subscribe(res => { console.log('forkjoin'); this._countStatus(res[0], res[1]); }); // This shows arrays in the console... this.statuses$.subscribe(res => console.log(res)); this.companies$.subscribe(res => console.log(res)); // In the console Array[9] Array[6] 不会被解雇。有任何想法吗?

upstream myapp {
   server 192.168.0.21:8080;
   server 192.168.0.22:8080;
   server 192.168.0.23:8080;
}

server {
    listen       80;
    server_name  localhost;

   location /foo/bar/blah/ {
      rewrite ^/foo/blah^/ /$1 break;
      proxy_pass http://myapp;
   }

5 个答案:

答案 0 :(得分:4)

forkJoin的一个非常常见的问题是它要求所有源Observable发出至少一个项目,并且所有项目都必须完成。

换句话说,如果this.statuses$this.companies$没有发出任何项目,并且在完成forkJoin之前不会发出任何内容。

this.statuses$.subscribe(
    res => console.log(res),
    undefined,
    () => console.log('completed'),
);

答案 1 :(得分:1)

forkJoin仅在所有内部可观测值都完成时发射。 如果您需要等效的forkJoin来监听每个来源的单个发射,请使用combineLatest + take(1)

combineLatest(
  this.statuses$,
  this.companies$,
)
.pipe(
  take(1),
)
.subscribe(([statuses, companies]) => {
  console.log('forkjoin');
  this._countStatus(statuses, companies);
});

两个源均发出信号后,combineLatest将发出信号,take(1)将在此之后立即退订。

答案 2 :(得分:0)

Observable.forkJoin([
      _someService.getUsers(),
      _someService.getCustomers(),
    ])
      .subscribe((data: [Array<User>, Array<Customer>]) => {
        let users: Array<User> = data[0];
        let customer: Array<Customer> = data[1];
      }, err => {
      });





      //someService
        getUsers():Observable<User> {
          let url = '/users';
          return this._http.get(url, headers)
            .map(res => res.json());
        }

        getCustomers():Observable<Customer> {
          let url = '/customers';
          return this._http.get(url, headers)
            .map(res => res.json());
        }

答案 3 :(得分:0)

this.statuses$.pipe(mergeMap(source => this.companies$.pipe(map(inner => [source , inner])))).subscribe(([e , r]) => { console.log(e , r); })

forkJoin无法正常工作,因此我使用了上面的代码来解决我的问题。使用mergeMap,您可以将外部订阅的结果映射到内部订阅,然后根据需要订阅

答案 4 :(得分:0)

对我来说,combineLatest运算符就是解决方案!