我试图更好地理解如何使用 RxJS 运算符来解决我遇到的特定问题。我实际上有两个问题,但它们足够相似。
我正在从 API 端点获取一堆文档,/api/v3/folders/${folderId}/documents
并设置了具有执行此功能的服务,并处理所有身份验证等。
但是,这个文档对象数组没有描述属性。为了获得描述,我需要调用/api/v3/documents/${documentId}/
上一次调用中的每个文档。我的文档界面如下所示:
export interface Document {
id: number;
name: string;
description: string;
}
我想我需要mergeMap
等待并获取文档,一些如何将描述添加到我的Document
界面并返回整个内容,但是我无法获得最终结果。
getDocuments(folderId: number) {
return this.docService.getDocuments(folderId, this.cookie).pipe(
map(document => {
document; // not entirely sure what to do here, does this 'document' carry over to mergeMap?
}),
mergeMap(document => {
this.docService.getDocument(documentId, this.cookie)
}) // possibly another map here to finalize the array?
).subscribe(res => console.log(res));
}
这可能看起来有点重复,但我发现的任何帖子都没有 100% 为我清理干净。
非常感谢任何有助于理解如何在第二次调用中正确使用数据并将其包装在一起的帮助。谢谢你。
感谢@BizzyBob,这是带有编辑和解释的最终解决方案:
getDocuments(folderId: number) {
const headers = new HttpHeaders({
'Content-Type': 'application/json',
'Context': this.cookie$
});
return this.docService.getDocuments(folderId, this.cookie$).pipe(
mergeMap(documents => from(documents)),
mergeMap(document => this.http.get<IDocument>(
this.lcmsService.getBaseUrl() + `/api/v3/documents/${document.id}`,
{ headers: headers }
).pipe(
map(completeDoc => ({...document, description: completeDoc.description}))
)),
toArray()
).subscribe(docs => {
this.documents = docs;
console.log(this.documents);
}
)
}
由于某种原因,我无法pipe()
从第二个服务订阅,所以我最终不得不在http.get
那里拨打电话。错误是“不能在类型订阅上使用 pipe()”,这有点令人困惑,因为我pipe()
在第一次订阅时使用。我将此更改应用于更新行为主题的服务功能,并且运行良好。谢谢!