Vielen Dank im Voraus für einen Blick auf diese.Knoten Grunt Asynchrone Aufgabe in Schleife mit Schließung funktioniert nicht
Ich habe eine asynchrone Aufgabe innerhalb einer Schleife, die nicht funktioniert. Ich habe dafür gesorgt, zu:
- meinen Looping Variable „Schlüssel“ Wickeln Sie in einem Verschluss den klassischen „letzten Wert nur“ zu vermeiden Problem, wo die Schleife lange beendet ist, bevor die Asynchron-Aufgaben einen Wert zurückgibt, und nur Der letzte Wert wird angezeigt.
- Aufruf done (Fehler), um meine asynchrone Aufgabe abzuschließen (nach den Gruntjs FAQ)
- Verwenden Sie hasOwnProperty(), um sicherzustellen, dass der Schlüssel eine tatsächliche Eigenschaft eines Objekts ist und nicht vom Prototyp stammt.
- Folgen Sie dem 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)" nenne, werden die Dateien in die Datei geschrieben (wenn ich die writelns durch grunt.file.write Statements ersetze).
var done = this.async(),
exec = require('child_process').exec,
myJSON = {
"file1" : "C:/home/me/jquery.js",
"file2 " : "C:/home/me/grunt.js",
...
"fileN" : "C:/home/me/N.js"
},
count;
for (var key in myJSON) {
if (myJSON.hasOwnProperty(key)) {
(function (key) {
exec('type "' + myJSON[key] + '"',
function(error, stdout, stderr) {
if (error) {
grunt.log.writeln('!!! exec error: ' + error);
}
grunt.log.writeln('stdout: ' + stdout);
grunt.log.writeln('stderr: ' + stderr);
done(error);
}
);
})(key);
count++;
}
}
Referenzen:
http://nodejs.org/api/child_process.html#child_process_child_process_exec_command_options_callback https://github.com/gruntjs/grunt/wiki/Frequently-Asked-Questions
tyvm Die FAQ führte mich zu der Annahme, dass done() für _jeden_ asych-Vorgang innerhalb einer Aufgabe aufgerufen werden musste.Dies war eine große Hilfe, ich schätze Ihre Zeit :) – user1354017
Also, die Take-Away hier ist Diese Dienstprogramme grunt.utils.async werden für das Arbeiten mit asynchronen Tasks bevorzugt - im Gegensatz zum manuellen Erstellen von Schließungen usw., richtig? – user1354017
Das ist cor rect, aber nicht nur für Grunzen. Es ist von unschätzbarem Wert, wenn Sie in Node.js arbeiten. https://github.com/caolan/async –