如何在不完成主题的情况下使用RxJs.toArray方法将流转换为数组?

时间:2018-02-08 06:32:22

标签: angular typescript rxjs

我想允许用户传递id来获取一些过滤后的数据。为此,我创建了一个允许发送Guid数组的主题:

selectedVacancies: Subject<string[]> = new Subject();
selectedVacancies.next(['a00652cd-c11e-465f-ac09-aa4d3ab056c9',
                         'f145b6a6-0a66-49d6-a2d2-eb9123061d96']);

我有另一个observable订阅了这个主题并等待数据到来(availableVacancies和availableVacancyTypes只是来自我的角度服务的Observable和Observable):

filteredVacancyTypes: Observable<VacancyTypeModel[]>;
filteredVacancyTypes = this.selectedVacancies
     .flatMap(vacancyIds => vacancyIds)
     .filter(id => !isNullOrUndefined(id))
     .flatMap(id => this.availableVacancies.first(v => v.id === id))
     .flatMap(v => this.availableVacancyTypes.filter(vt => vt.id === v.type.id))

我想累积过滤后的数据并将其作为VacancyTypeModel数组返回。我知道存在什么样的方法,但我无法使用它,因为主题永远不会完成(因为我必须等待用户发布另一个ID)

是否有任何方法可以在不完成源的情况下将数据作为数组返回?

1 个答案:

答案 0 :(得分:2)

使用scan运算符可以轻松累积项目:

filteredVacancyTypes = this.selectedVacancies
  .scan((acc, arr) => [...acc, ...arr], [])
  .flatMap(vacancyIds => vacancyIds)
  ...

scan会发出每个中间结果。您可以在以后需要所有逻辑后使用它:

filteredVacancyTypes = this.selectedVacancies
  .flatMap(vacancyIds => vacancyIds)
  ...
  .scan((acc, val) => [...acc, val], [])