首页 > 解决方案 > 有没有更好的方法来顺序调用不同的可观察调用?

问题描述

我有两种 API 方法:

发布到修订的结果是修订文档,其中包括对文章对象的更改之前/之后。它不是文章对象。

这些对应于我的 Angular 应用程序中的以下方法:

分别返回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 略有不同。如果它不属于,请随意删除它。

标签: angulartypescriptrxjs

解决方案


作为记录,我相信 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 将两个值的数组作为可观察对象返回(类似于上面,只需将它们返回到数组中)。


推荐阅读