仅在forEach循环的最后一次迭代中触发函数

时间:2016-11-11 06:47:52

标签: javascript loops

以下代码检查字段是否为文件类型,以及其中是否存在实际文件。如果是这种情况,请上传照片并更新建筑物。如果不是这样,请使用旧照片更新建筑物:

  fields.forEach(field => {
    building[field.name] = field.value || this.building[field.name]
    if (field.type === 'file' && !util.isEmpty(field.photo.file)) {
      api.uploadPhoto(field.photo.file).then(resp => {
        building[field.name] = resp
        this.updateBuilding(building)
      })
    } else {
      building.logo = this.building.logo // to prevent updating logo
      building.floorplan = this.building.floorplan // to prevent updating logo
      this.updateBuilding(building)
    }
  })

效果很好,但由于this.updateBuilding(building)处于循环中,因此它被称为倍数。

如何做到只在最后一次迭代中调用?

5 个答案:

答案 0 :(得分:3)

您可以查看 fields array fields.length ,它将是fields数组的最后一个元素。

if(fields[fields.length - 1]){
 // Loop control will enter in this block in last iteration
 // Enter your update code inside this
}

希望这就是你要找的东西。

答案 1 :(得分:2)

MDN documentation表示回调forEach有三个参数:

  1. 元素值
  2. 元素索引
  3. 正在遍历的数组
  4. 您可以使用它来检查当前元素的索引是否等于数组的最后一个索引:

    fields.forEach((field, index, array) => {
    
      // YOUR CODE
    
      if (index === array.length - 1) {
        // DO SOMETHING
      }
    });
    

答案 2 :(得分:1)

在每次迭代时使用一个递增的count变量,如果field.length等于count变量,则使用if条件调用函数

var count = 0;
var fields_length = fields.length;
fields.forEach(field => {
    building[field.name] = field.value || this.building[field.name]
    if (field.type === 'file' && !util.isEmpty(field.photo.file)) {
      api.uploadPhoto(field.photo.file).then(resp => {
        building[field.name] = resp

      })
    } else {
      building.logo = this.building.logo // to prevent updating logo
      building.floorplan = this.building.floorplan // to prevent updating logo

    }
    if(count == fields_length){
       this.updateBuilding(building)
    }

count++
  })

答案 3 :(得分:1)

尝试:

var len = fields.length;
var counter = 0;

fields.forEach(field => {
    building[field.name] = field.value || this.building[field.name]
    if (field.type === 'file' && !util.isEmpty(field.photo.file)) {
        api.uploadPhoto(field.photo.file).then(resp => {
            building[field.name] = resp

            /* checking if it's the last loop */
            if(counter == len - 1)
                this.updateBuilding(building)
        })
    } else {
        building.logo = this.building.logo // to prevent updating logo
        building.floorplan = this.building.floorplan // to prevent updating logo
  this.updateBuilding(building)
    }

    counter = counter + 1;
})

答案 4 :(得分:1)

如何创建一些变量以在循环中保存适当的值; 循环之后,您可以使用这些变量运行构建更新。

<强>更新

哦,你实际上需要一个回调更新。 你在循环中有一些异步操作???