gpt4 book ai didi

javascript - 在 Observable 中转换数据

转载 作者:行者123 更新时间:2023-11-30 20:47:28 24 4
gpt4 key购买 nike

我正在从我的 Angular 服务上的 Observable 中检索项目列表。在每个项目中,我都有一个包含主题列表的数组。对于每个主题,我都需要再次调用以获取其详细信息(例如名称、描述等)。

数据结构:

- post1
- subjects: ['books', 'cars', 'movies']

有了这个列表,我就有了每个主题的 id,但我需要返回一个包含属于该帖子的所有主题(及其详细信息)的可观察对象。

AppService.ts

getPost(id: string): Observable<Post> {
return Observable.of({id: id, subjects: ['books', 'cars', 'movies']});
}

getSubjects(id: string): Observable<Subject[]> {
return this.getPost(id).pipe(
map((post: Post) => post.subjects),
mergeMap((subjects: string[]) => subjects.map((id: string) => this.getSubject(id))),
switchMap(list => list),
);
}

getSubject(id: string): Observable<Subject> {
switch (id) {
case 'books':
return Observable.of({id: 'books', name: 'Books'});
case 'cars':
return Observable.of({id: 'cars', name: 'Cars'});
case 'movies':
return Observable.of({id: 'movies', name: 'Movies'});
}
}

它返回一个对象流,但我想返回一个包含所有主题的数组。

[ DEMO ]

最佳答案

那是因为你混淆了Observables.map().map()Array.prototype.map().map() .

这行代码:

 mergeMap((subjects: string[]) => subjects.map((id: string) => this.getSubject(id)))

不返回主题数组;相反,它返回一个 Observables 数组,因为函数内的 subject 参数是一个数组,而不是一个 Observable。因此,那个特定的 .map() 将返回一个 retyrn 类型的数组 this.getSubject(id),这是一个 Observables 的数组>;正是你得到的行为。

如果你想把所有的Observables解析成一个Subjects数组,你必须使用Observable.forkJoin。 . .forkJoin() 组合所有可观察对象并并行触发它们。

getSubjects(id: string): Observable<Subject[]> {
return this.getPost(id).pipe(
map((post: Post) => post.subjects),
mergeMap((subjects: string[]) => Observable.forkJoin([...subjects.map((id: string) => this.getSubject(id))])),
);
}

现在你可以在你的组件中使用它了:

getSubjects(id).subscribe(values=>{
console.log(values)//returns an array of Subjects
})

请注意,Observables.forkJoin 必须等待所有 可观察对象完成后才能发射。

关于javascript - 在 Observable 中转换数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48553022/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com