angular - 在循环中对同一 API 进行角度多次调用
问题描述
我需要遍历对象数组并为每个对象进行 API 调用。根据响应中的对象数量,我正在创建新对象并推入一个数组。下面是示例代码。例如,如果最初有 2 个提供者,每个提供者都有 2 个位置,那么updatedProviderList
将有 4 个提供者。这工作正常。
问题是,updateProvidersInState
只有在所有 API 调用和与之相关的逻辑都完成后才能调用。我已尝试使用如下所示的索引,但它不起作用。updateProvidersInState
只有在所有 API 调用完成后才能调用?
let providers = []; //assume this is already populated
let updatedProvider;
let updatedProviderList;
providers.forEach((prv, index) => {
this.dataService.getLocation(prv.id).subscribe((response: LocationResults) => {
response.locations.forEach((location, i) => {
updatedProvider = cloneDeep(prv);
updatedProvider.location = location;
updatedProviderList.push(updatedProvider);
if (index === providers.length - 1 && i === response.length - 1) {
this.updateProvidersInState(updatedProviderList);
}
});
});
});
解决方案
该forkJoin()
功能允许您加入可观察对象列表并在所有请求完成后继续。这样做的好处是请求将并行而不是顺序发出。
import { forkJoin } from 'rxjs';
let providers: Provider[] = []; // assume this is populated, i made up the type Provider.
forkJoin(
providers.map(p =>
this.dataService.getLocation(p.id).pipe(
// map each Location to a cloned provider object
map((response: Location[]) => response.map(location => {
const updatedProvider = cloneDeep(p);
updatedProvider.location = location;
return updatedProvider;
}))
)
)
).subscribe((p: Provider[][]) => {
// flatten the multi-dimensional array
const updatedProviders = [].concat(...p);
this.updateProvidersInState(updatedProviders);
});
推荐阅读
- twitter-bootstrap - Carousel 在 IE11 中看起来很奇怪,在其他浏览器中很好
- regex - 如何从列类型列表中删除 pandas DataFrame 中的空值
- delphi - 如何用 ImageList 中的另一个图像替换 TSpeedButton 中的图像?
- authentication - 如何在自定义登录配置文件中集成 Azure B2C 用户迁移技术配置文件?
- oracle - 如何从表参数中选择行到游标中
- android - 如何调试通过谷歌驱动器安装的apk?
- sql - 包含 SQL 身份验证的 SSIS 在 IDE 中运行,但在 SQL Server 代理作业中失败
- ietf-netmod-yang - Netconf 编辑配置
- html - 我是否使用了 CSS 选择器(和/或/否定)的正确组合?
- r - lapply 模型输出并总结结果