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

Ale*_*TGM 6 rxjs typescript angular

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

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

我有另一个可观察的对象,它订阅了该主题并等待数据到来(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))
Run Code Online (Sandbox Code Playgroud)

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

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

mar*_*tin 5

操作员可以轻松积累物品scan

filteredVacancyTypes = this.selectedVacancies
  .scan((acc, arr) => [...acc, ...arr], [])
  .flatMap(vacancyIds => vacancyIds)
  ...
Run Code Online (Sandbox Code Playgroud)

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

filteredVacancyTypes = this.selectedVacancies
  .flatMap(vacancyIds => vacancyIds)
  ...
  .scan((acc, val) => [...acc, val], [])
Run Code Online (Sandbox Code Playgroud)