等待最后一个订阅结束

时间:2019-03-13 11:53:50

标签: angular typescript rxjs observable

我有以下设置:

    let result = service.getResults();

    result.data.forEach((row:any) => {
          this.myService
            .getObject(row.id)
            .subscribe((object:any) => {
              //...
            })
        );
      }

getObject(row.id)的所有订阅完成后,我想做些事情。我知道有add()函数,但是它将对每个Subscription都执行。来自Promises,我将每个Promise存储在一个数组中,然后命名为Promise.all()。

2 个答案:

答案 0 :(得分:4)

  

在完成对getObject(row.id)的所有订阅后,我想做些事情。

最好使用forkJoin作为示例。来自官方文档:

  

forkJoin将等待所有传递的Observable完成,然后它将发出一个数组,其中包含来自相应Observable的最后一个值。

尝试通过这种方式做到:

import { forkJoin } from 'rxjs';

const rowObjects$ = result.data.map(rd => this.myService.getObject(rd.id));

forkJoin(rowObjects$)
  .subscribe((object:any) => {
    //...
  })

答案 1 :(得分:-1)

您可以使用combineLatest合并所有可观察对象,并等待直到每个可观察对象至少触发一次。

import {combineLatest} from 'rxjs';
...



let result = service.getResults();

const observablesToCombine = [];

result.data.forEach((row:any) => {
      observablesToCombine.push(this.myService.getObject(row.id));
})

combineLatest(observablesToCombine).subscribe((object: Array<any>) => {
     //...
})