Node Grunt Asynchrone Task in Schleife mit Closure funktioniert nicht

8

Vielen Dank im Voraus für einen Blick auf das.

Ich habe eine asynchrone Aufgabe innerhalb einer Schleife, die nicht funktioniert. Ich habe dafür gesorgt:

  1. Wickeln Sie meinen Schleifenvariablen-Schlüssel in einen Abschluss, um den klassischen "letzten Wert" zu vermeiden nur "Problem, bei dem die Schleife endet, lange bevor die asynchronen Tasks einen Wert zurückgeben und nur der letzte Wert angezeigt wird.
  2. Aufruf done (Fehler), um meine asynchrone Aufgabe abzuschließen (laut Gruntjs FAQ)
  3. Verwenden Sie hasOwnProperty (), um sicherzustellen, dass der Schlüssel eine tatsächliche Eigenschaft eines Objekts ist und nicht vom Prototyp stammt.
  4. Befolgen Sie das Format des Beispiels node.exec, mit dem Unterschied, dass Sie den Wert von exec einer Variablen zuweisen - was ich versucht habe, aber es hat nicht geholfen. Siehe erste Referenz unten.

Diese Funktion gibt ... nichts aus !? Aus irgendeinem Grund feuern die grunt.log.writeln-Anweisungen nicht einmal ab. Aufgabe wird ohne Fehler abgeschlossen. Ich habe auch versucht, eine Verzögerung von 20 Sekunden hinzuzufügen, falls das Skript fertig war, bevor die asynchrone Aufgabe zurückgegeben wurde. Seltsamerweise, wenn ich nicht "done (error)" rufe, werden die Dateien in die Datei geschrieben (wenn ich die writelns durch grunt.file.write Statements ersetze).

%Vor%

Referenzen:

Ссылка Ссылка

    
user1354017 18.01.2013, 21:26
quelle

1 Antwort

12

done() sollte nur aufgerufen werden, wenn die gesamte Operation abgeschlossen ist, dh wenn alle exec() -Methoden ihre Rückrufe ausgeführt haben. Derzeit führen Sie den done -Rückruf bei jeder Iteration durch. Sie können dies leicht erreichen, indem Sie die Methode forEach im Knotenmodul async verwenden, das mit grunt ( grunt.util.async ( oder forEachSeries , wenn die exec() -Methoden in der Reihenfolge ausgeführt werden sollen.

So etwas (nicht getestet):

%Vor%     
Sindre Sorhus 20.01.2013 21:19
quelle