angular - 有没有更好的方法来顺序调用不同的可观察调用?
问题描述
我有两种 API 方法:
POST
/articles/{id}/revisionsGET
/文章/{id}
发布到修订的结果是修订文档,其中包括对文章对象的更改之前/之后。它不是文章对象。
这些对应于我的 Angular 应用程序中的以下方法:
this.endpoint.articles.revise(article.id, revisionParams);
this.endpoint.articles.getById(article.id);
分别返回Observable<ArticleRevision>
和。Observable<Article>
当我修改文档时,我想提取包含我更改的文档的更新副本。目前,我可以通过执行以下操作来实现这一目标:
private reviseArticle(article: article, revisionParams: ArticleRevisionParams): Observable<Article> {
return this.endpoint.articles.revise(article.id, revisionParams)
.expand(r => this.endpoint.articles.getById(article.id))
.pipe(take(2))
.last();
}
从描述 或expand
,听起来这种方法更像是一种破解而不是解决方案:
递归调用提供的函数。
我尝试使用concat
,但发现它需要相同类型的可观察对象,这在我的情况下有点碍事。我是在滥用expand
,还是有更好(更正确)的方法来顺序链接不同的可观察对象?
PS 我标记了 Angular,以防 rxjs 的 Angular 捆绑风格与常规 rxjs 略有不同。如果它不属于,请随意删除它。
解决方案
作为记录,我相信 Angular 基于这个 package.json使用与我们其他人相同的 rxjs 库。
幸运的是,rxjs 提供了许多选项来以不同的方式完成任务。我个人没有以这种方式使用过扩展,但它看起来是一个非常简洁的实现。
您可以这样做的一种方法是创建一个新接口来容纳这两种类型:
export interface MyTypes {
rev: ArticleRevision;
article: Article;
}
这样,您可以通过使用switchMap 运算符并在一个类型上设置两个响应的值并返回 observable 来从流中返回单个类型。
初稿:
export interface MyTypes {
rev: ArticleRevision;
article: Article;
}
private reviseArticle(article: article, revisionParams: ArticleRevisionParams): Observable<MyTypes> =>
this.endpoint.articles.revise(article.id, revisionParams)
.pipe(
switchMap((rev: ArticleRevision) =>
this.endpoint.articles.getById(article.id)
.pipe(
switchMap((art: Article) => ({
rev: rev,
article: art,
})
)
);
您还可以使用 switchMap 将两个值的数组作为可观察对象返回(类似于上面,只需将它们返回到数组中)。
推荐阅读
- r - 使用 R 中的 networkD3 在 RStudio 查看器中不显示桑基图
- python - 如何在没有循环的情况下覆盖文本文件中任何新行号的值
- python - 我如何“专业地”在 python 中存储小数据?
- python - Selenium WebDriver:如何教 webDriver 它现在正在查看新页面
- filemaker - 在 FileMaker 中查找调用脚本的脚本
- python - 如何让循环记住以前迭代的信息?
- php - Laravel 全局范围和 if 检查
- html - 在 amcharts 地图 v3 中隐藏缩放控制?
- java - 跨独立应用程序的 Commons-Configuration2 同步器如何实现线程安全
- java - org.testng.TestNGException:实例化类时发生错误。检查以确保它可以被实例化/访问