[英]How to wait for multiple HTTP calls to be completed in Angular with RXJS?
在这个演示应用程序中,我们具有以下结构:
单击文章项可加载其详细信息。
但我面临的问题是导出按钮(在这种情况下模拟)。 初始导出不包含文章详细信息。 如果我在几秒钟后再次导出,也会包含详细信息。
文章服务中的延迟模拟了 http 调用中的一些延迟。 解决这个问题的正确方法是什么? 我知道添加一些延迟()时这是有效的,但我不喜欢这个解决方案。
https://stackblitz.com/edit/angular-ivy-riqbsz?file=src%2Findex.html
*ngIf="(allArticleDetailsLoaded$ | async)"
在您发出获取详细信息的请求后,有条件地加载您的文章。 如果您想在下载之前确保文章中包含详细信息,您可以简单地隐藏或禁用导出按钮,直到加载详细信息,即allArticleDetailsLoaded$
行为主题发出 true。
你有什么
<button *ngIf="(articleService.articles$ | async)" (click)="simulateExport()">
Export Articles into file
</button>
你应该拥有的
<button *ngIf="(allArticleDetailsLoaded$ | async)" (click)="simulateExport()">
Export Articles into file
</button>
您想使用来自CombineLatest
的 CombineLatest
https://stackblitz.com/edit/angular-ivy-nmpzez?file=src/app/app.component.ts
注意:我还更改了 LoadDetailsArticle 以返回一个 observable。
您需要创建一个 observables 数组并将其传递给 combineLatest function。 一旦所有的 observables 返回它们的最新值,它们将被用于返回订阅。
simulateExport() {
// create empty array to pass to combineLatest
let loadDetailsForArticlesArray = [];
this.articleService.articles$.subscribe(articles => {
articles.forEach(article => {
//push each observable to array
loadDetailsForArticlesArray.push(
this.articleService.loadDetailsForArticle(article)
);
});
});
// wait for all observables to resolve.
combineLatest(loadDetailsForArticlesArray).subscribe(res => {
this.allArticleDetailsLoaded.next(true);
});
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.