我想允许用户传递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)
是否有任何方法可以在不完成源的情况下将数据作为数组返回?
答案 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], [])