1 回答
TA贡献1946条经验 获得超3个赞
使用错误的原因switchMap是因为您没有返回 Observable。
当使用任何“高阶映射运算符”(switchMap、concatMap、mergeMap 等)时,提供的函数必须返回一个可观察对象。正如错误所述:“类型void不可分配给类型ObservableInput<any>”,您没有返回任何东西(无效)。
接下来不太正确的是,在您的循环中,您引用ref.snapshotChanges().pipe()了 ,但您从不订阅它。您可能知道,可观察对象是惰性的,除非有订阅者,否则不会触发。
只要您在 中返回一个可观察对象switchMap(),它就会自动订阅它并发出它的值。
让我们换个角度思考这个问题;而不是遍历第一次调用的结果,执行它们,然后将值推入数组。相反,我们可以获取结果并将它们变成一个可观察的流,该流发出它们各自调用的所有结果,并为您将它们组合成一个数组。但是......有一个微妙的区别:我建议不要tagData在流之外有一个单独的数组,而是让你的可观察对象返回tagData你需要的形式作为Observable<TagData[]>.
我认为这样的事情对你有用:
tagData$ = this.pageService.getTagsOnPage(this.workspaceId, this.currentPage.id).pipe(
switchMap(references => from(references)),
mergeMap(ref => this.afs.doc(ref).snapshotChanges()),
map(actions => actions.payload.data()),
scan((allTagData, tagData) => [...allTagData, tagData], [])
})
);
让我们分解一下!
现在,您可以简单地执行:tagData$.subscribe()
并使用生成的数据数组执行您想要的操作。或者你甚至可以在你的模板中使用异步管道而不是在你的组件中订阅。
添加回答
举报