2016-11-11 2 views
0

Der folgende Code prüft, ob ein Feld vom Typ datei ist und ob eine tatsächliche Datei darin enthalten ist. Wenn dies der Fall ist, laden Sie das Foto hoch und aktualisieren Sie die Gebäude. Wenn das nicht der Fall ist, aktualisieren Sie die Gebäude, die alten Fotos mit:Auslösen einer Funktion nur in der letzten Iteration einer ForEach-Schleife

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) 
    } 
    }) 

Es funktioniert gut, aber da this.updateBuilding(building) in einer Schleife ist, es wird ein Vielfaches genannt.

Wie wird es gemacht, so dass es nur in der letzten Iteration aufgerufen wird?

Antwort

1

Die MDN documentation legen nahe, dass der Rückruf zu forEach drei Argumente hat:

  1. der Elementwert
  2. Der Elementindex
  3. Das Array

Sie es querten verwenden Überprüfen Sie, ob der Index des aktuellen Elements gleich dem letzten Index des Arrays ist:

fields.forEach((field, index, array) => { 

    // YOUR CODE 

    if (index === array.length - 1) { 
    // DO SOMETHING 
    } 
}); 
+1

Ich kann nicht glauben, dass ich JavaScript seit Jahren gemacht habe und ich wusste nicht, dass 'forEach' einen Index und einen Array-Wert hat. Vielen Dank! – alex

+1

Hat mich überrascht, als ich davon erfuhr! –

1

eine Zählvariable mit Schritt bei jeder Iteration verwendet werden, und eine, wenn die Bedingung verwenden, wenn field.length gleich

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++ 
    }) 
+0

Sie verwenden 'if (count == fields.length)'. Dies wird durch die gesamte Sammlung iterieren, um die Länge jedes Mal zu berechnen. Es ist besser, wenn Sie die Länge einmal außerhalb der Schleife berechnen und "count" mit diesem Wert vergleichen. – mrid

3
die Funktionsvariable Anruf zählen

Sie fields.length Array von Felder überprüfen und es wird das letzte Element des Felder-Arrays sein.

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

Ich hoffe, das ist, was Sie gesucht haben.

+0

'fields.length -1', da JavaScript null indiziert ist? – alex

+0

Warte, damit ich das Element auf diese Weise bekommen kann. Ich muss es mit etwas anderem vergleichen? (Im Moment kommt die Schleife nie in die if-Anweisung.) – alex

1

Versuchen:

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; 
}) 
1

Wie über Sie einige Variablen erstellen, um die entsprechenden Werte in der Schleife zu halten; Nach der Schleife können Sie das Update beim Erstellen mit diesen Variablen ausführen.

UPDATE

Oh, Sie müssen tatsächlich einen Rückruf für das Update. Sie haben eine asynchrone Operation in der Schleife ???

Verwandte Themen