【问题标题】:Angular 4 chaining http get request(Promises)Angular 4 链接 http 获取请求(承诺)
【发布时间】:2017-11-08 09:30:36
【问题描述】:

我想就以下代码获得一些帮助:

fillDataAssociationsArray(DataAssociationIDS: string[]) {
const promise = new Promise((resolve, reject) => {
  for (const id of DataAssociationIDS) {
    this.api.getDataAssociationByID(id).toPromise().then(
      data => {
        this.DataAssociations.push(data.body.entities.DATAASSOCIATIONS[0]);
      });
  }
  resolve();
});

return promise;}

在上面的代码中,我尝试将 DataAssociationIDS 数组转换为 DataAssociation 对象,然后将它们推送到 DataObjects[] 的本地数组。我从数组(参数)中获取每个带有 id 的 DataObject,然后对从后端返回正确 DataObject 的 API 执行获取请求。

public getDataAssociationByID(dataAssociationID: string) {
return this.http.get<DataAssociationInterface>(this.apiURL + 'typeOne=DATAASSOCIATIONS&id=' + dataAssociationID,
 { observe: 'response' });}

我想从我的 api 链接一些 HTTP 获取请求,每个请求取决于前一个请求的结果。所以我的想法是对这些请求做出承诺并使用 then() 方法如下:firstRequest().then( SecondRequest().then(...)) 等等。

我的尝试

ngOnInit() {
   this.fillDataAssociationsArray(this.extractDataAssociationIdsFromActivities()).then(
  () => console.log(this.DataAssociations)
  // () => console.log(this.DataAssociations[0].languages.DUT.name)
);}

First result Second line result

then() 块中的第一行打印正确的结果本地数组,但是,当我尝试打印未定义的项目名称的第二行(注释)时?当我链接下一个请求时,它显然也无法读取 undefined。

【问题讨论】:

    标签: angular http get es6-promise chaining


    【解决方案1】:

    我认为您在这里遇到了异步问题。

    在从 http get 调用获得结果之前,您可能正在解决您的承诺。

    我认为解决此问题的最佳方法是添加一个 api 调用以获取一组 id 并返回一组结果。但是对于这个用例,我的方法是:

    fillDataAssociationsArray(DataAssociationIDS: string[]) {
    const promise = new Promise((resolve, reject) => {
      for (const id of DataAssociationIDS) {
        this.api.getDataAssociationByID(id).toPromise().then(
          data => {
            this.DataAssociations.push(data.body.entities.DATAASSOCIATIONS[0]);
            if (this.DataAssociations.length === DataAssociationIDS.length) {
              resolve();
            }
          });
      }
    });
    
    return promise;}

    【讨论】:

    • 您是英雄! if 语句解决了问题,并且确实在执行所有调用之前解决了 Promise。
    • 太棒了!乐于助人:)
    猜你喜欢
    • 2018-03-30
    • 2014-05-30
    • 1970-01-01
    • 2016-06-01
    • 1970-01-01
    • 2016-06-21
    • 2017-02-22
    • 2018-08-11
    • 1970-01-01
    相关资源
    最近更新 更多