如何迭代一个值数组,调用一个返回承诺的服务,并在Angular 6中等待每个结果
我有一个Angular 6项目,其中我得到一个字符串数组,需要使用数组中的每个项调用后端服务 简化的组件代码如下所示:如何迭代一个值数组,调用一个返回承诺的服务,并在Angular 6中等待每个结果,angular,typescript,iterator,async-await,observable,Angular,Typescript,Iterator,Async Await,Observable,我有一个Angular 6项目,其中我得到一个字符串数组,需要使用数组中的每个项调用后端服务 简化的组件代码如下所示: items: any[] = ['one','two','three'] for (let item of this.items) { this.dataSvc.searchItems(item) .subscribe( data => { console.log(item, data); }) }
items: any[] = ['one','two','three']
for (let item of this.items) {
this.dataSvc.searchItems(item)
.subscribe(
data => {
console.log(item, data);
})
}
public searchItems(item: string): Observable<any> {
let params = new HttpParams();
params = params.append('item', item);
return = this.httpClient.get(SERVER_API, { params: params })
}
角度服务代码如下:
items: any[] = ['one','two','three']
for (let item of this.items) {
this.dataSvc.searchItems(item)
.subscribe(
data => {
console.log(item, data);
})
}
public searchItems(item: string): Observable<any> {
let params = new HttpParams();
params = params.append('item', item);
return = this.httpClient.get(SERVER_API, { params: params })
}
这对数组中的单个项很好,但是当数组扩展时,服务开始抛出超时错误,并返回一些(但不是全部)结果
我以前在与这个后端交互时遇到过问题,在其他领域,我有一个固定的、不会改变的项目列表,我在代码中链接了一系列静态的承诺,这样我每次都会等待调用服务,直到上一个结果回来,但是我不确定如何在循环中完成同样的事情
这就是我在组件中使用承诺包装器管理其他地方的承诺链的方式:
fetchService(item): Promise<any> {
return this.dataSvc.searchItems(item)
.toPromise();
}
this.fetchService('one')
.then(data => {
console.log("one", data);
return this.fetchRegCodeLit('two')
}).then(data => {
console.log("two", data);
return this.fetchRegCodeLit('three')
}).then(data => {
console.log("three", data);
})
items数组是动态的,它可能包含10个或100个项目,我需要能够将每个项目传递给同一个服务,并保证在再次调用该服务之前收到响应并进行处理,但我似乎不知道如何处理
我一直在研究async/await,我认为这就是解决方案所在,但我尝试过的任何代码排列都会导致编译错误,因此我显然遗漏了一些东西。我认为async/await也是答案。它应该简单到:
public async searchItems(item: string): Observable<any> {
let params = new HttpParams();
params = params.append('item', item);
request = await this.httpClient.get(SERVER_API, { params: params });
return request;
}
我觉得你的服务还行。这里有一个网站,可以让你了解一些承诺
使用toPromise可能是件好事。你可以把所有的事情并行运行,然后带着承诺等待结果
由于您使用的是Observable,我看不到您取消订阅,因此您的问题可能是内存泄漏,要一次性取消订阅,您可以这样做。dataSvc.searchItemsitem.pipetakeWhile=>this.isAlive.subscribe data=>{console.logitem,data;}当您将this.isAlive设置为false时,所有这些都将取消订阅谢谢-我确实在Ngondestory中使用.pipetakeUntilthis.ngUnsubscribe取消订阅,但为了简化示例,省略了所有代码。这是一个很好的方法,链接的文章提供了很好的理由,但是您的代码中有错误。方法的返回类型错误,您需要像使用符咒一样使用toPromiseWorks!