Angular 4链接http获取请求(Promises)

时间:2017-11-08 09:30:37

标签: angular http get es6-promise chaining

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

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,然后对API执行get请求,该API从后端返回正确的DataObject。

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

我想从我的api链接一些HTTP get请求,每个请求取决于前一个请求的结果。所以我的想法是对这些请求做出承诺并使用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() - block中的第一行打印正确的结果本地数组但是,当我尝试第二行(注释)打印项目的名称时,我得到未定义的???当我链接下一个请求时,显然也无法读取undefined。

1 个答案:

答案 0 :(得分:0)

我认为你这里有一个异步问题。

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

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

&#13;
&#13;
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;}
&#13;
&#13;
&#13;