【问题标题】:How to iterate through an API response and assign response value to nested array in angular 8如何遍历 API 响应并将响应值分配给角度 8 中的嵌套数组
【发布时间】:2021-06-07 17:11:36
【问题描述】:

我试图在一个循环中多次调用 API,在响应中,我将项目 id 分配回数组,但 m 的值在运行第二个循环之前已经增加,这会引发错误 TypeError: Cannot读取未定义的属性“imagesnamearray”。

var  m = 0;
for (var j=0 ; j<this.imagesdataarray.length;j++){
  var n=0;
  for (var i=0;i<this.imagesdataarray[j].imagesnamearray.length;i++){
    const fd = new FormData();
    fd.append('userID',this.userid );
    fd.append('projectID', this.imagesdataarray[j].projectid);
    fd.append('id',this.imagesdataarray[j].imagesnamearray[i].imageid);
    fd.append('formFiles', this.imagesdataarray[j].imagesnamearray[i].image );

    this.http.post('http://api.interiordesigns2020.com/api/services/app/ImageProject/CreateProjectImages',fd)
    .subscribe(async (res) => {
      this.data=res;
      this.imagesdataarray[m].imagesnamearray[n].imageid=this.data.result; 
      n++;
    });
    
  }
  m++;

}

【问题讨论】:

    标签: angular typescript http typescript-generics


    【解决方案1】:

    问题在于m 是一个全局变量,而您的回调(subscribe 的参数)是异步执行的。

    您的代码首先创建了大量 HTTP 请求,在此过程中增加了 m 和 n。有时稍后,HTTP 请求完成并调用您的回调。到那时,m 不再具有您启动请求时的值。

    我会重写你的代码如下。我还用Array.forEach 替换了您的for 循环。

    this.imagesdataarray.forEach(imagedata => {
      imagedata.imagesnamearray.forEach(imagename => {
        const fd = new FormData();
        fd.append('userID', this.userid );
        fd.append('projectID', imagedata.projectid);
        fd.append('id', imagename.imageid);
        fd.append('formFiles', imagename.image);
    
        this.http
          .post('http://api.interiordesigns2020.com/api/services/app/ImageProject/CreateProjectImages', fd)
          .subscribe(data => {
            imagename.imageid = data.result; 
          });
      })
    });
    

    【讨论】:

    • 感谢您的帮助,但我仍有一个问题 HTTP 请求仍未等待 API 响应分配给图像名称的 imageid 不正确。
    • 您的意思是要等到所有 HTTP 请求都完成?这需要不同的设置。看看forkJoin。
    猜你喜欢
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2019-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-29
    相关资源
    最近更新 更多