在Angular 6中一对一处理多个http响应

时间:2018-10-24 11:13:07

标签: javascript angular typescript http rxjs

实际上,我有15个http请求被发送到API。我想一个接一个地处理响应,并在请求结束时打印响应。

服务端:

@Module
public class MyModule {

    @Provides
    @Singleton
    MyApi providesMyApi() {
        return new MyApi();
    }
}

组件侧:

    findOneByOne(): Promise<any> {
    const promises = [];

    this.getCardsPath().forEach(element => {
        promises.push(this.getPromises(element));
    });
    return Promise.all(promises)
        .then((res) => res)
        .catch(err => err);
}

getPromises(str: String): Promise<any> {
    return this.requester.obtain({
        restUrl: "/administration/" + str,
        method: RequestMethod.Get
    })
        .toPromise()
        .then(res => this.checkInfoService(res.json()))
        .catch(err => err);
}

我是Angular的初学者,所以我真的不知道如何处理多重承诺。

在此先感谢您的帮助:)

3 个答案:

答案 0 :(得分:2)

尝试一下:

findOneByOne() {
  const calls = this.getCardsPath().map(el => this.getPromises(el));
  forkJoin(calls).subscribe(responses => {...});
}

responses将包含每个响应,从第一次调用到最后一个调用:responses[0]将是第一个元素的响应,依此类推。

答案 1 :(得分:0)

您可以使用Observable的zip运算符,您可以在其中压缩我们所有的15个API调用,并按压缩顺序将响应以数组的形式获取。

有关zip运算符的更多信息:https://www.learnrxjs.io/operators/combination/zip.html

答案 2 :(得分:0)

您可以使用 async / await

api请求示例

export function getData(data) {
  return of(data)
    .pipe(delay(2000))
    .toPromise()
}

组件

  async display() {
    let first = await getData('first call');
    console.log(first);

    let second = await getData('second call')
    console.log(second)
  }
  

您需要使用async标记方法,以使用await并将任何可观察到的转换为promise作为api请求的示例

demo