如何迭代一个值数组,调用一个返回承诺的服务,并在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); }) }

我有一个Angular 6项目,其中我得到一个字符串数组,需要使用数组中的每个项调用后端服务

简化的组件代码如下所示:

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!