gpt4 book ai didi

angular - 有没有更好的方法来顺序调用不同的可观察调用?

转载 作者:太空狗 更新时间:2023-10-29 18:22:06 28 4
gpt4 key购买 nike

我有两个 API 方法:

  • POST/文章/{id}/修订
  • GET/文章/{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 , 听起来这种方法更像是一种 hack 而不是解决方案:

Recursively call provided function.

我尝试使用 concat ,但发现它需要相同类型的可观察对象,这在我的案例中有点阻碍。我在滥用 expand 吗? ,或者是否有更好(更正确)的方式来顺序链接不同的可观察对象?

附言我标记了 Angular,以防 rxjs 的 Angular 捆绑风格与常规 rxjs 略有不同。如果它不属于您,请随时将其删除。

最佳答案

郑重声明,我相信 Angular 正在使用与我们其他人相同的 rxjs 库,基于 this package.json .

幸运的是,rxjs 提供了多种选项来以不同的方式完成任务。我个人没有以这种方式使用扩展,但它看起来是一个非常简洁的实现。

您可以这样做的一种方法是创建一个新接口(interface)来容纳这两种类型:

export interface MyTypes {
rev: ArticleRevision;
article: Article;
}

这样,您可以使用 switchMap operator 从流中返回单一类型并在一种类型上设置两个响应的值并返回可观察值。

草稿:

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 将两个值的数组作为可观察值返回(与上面类似,只需将它们返回到一个数组中)。

关于angular - 有没有更好的方法来顺序调用不同的可观察调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54661048/

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