Wie kann man die Funktionen child_process.exec und child_process.execFile von Node mit Bluebird promiziieren?
Ich bin mit dem Bluebird Versprechen-Bibliothek unter Node.js, es ist toll! Aber ich habe eine Frage:
Wenn Sie einen Blick auf die Dokumentation des Knotens child_process.exec und child_process.execFile können Sie sehen, dass diese beiden Funktionen sind der Rückgabe einen ChildProcess Objekt.
Also, was ist der empfohlene Weg, um promisify solche Funktionen?
Beachten Sie, dass das folgende funktioniert (ich bekomme ein Promise-Objekt):
var Promise = require('bluebird');
var execAsync = Promise.promisify(require('child_process').exec);
var execFileAsync = Promise.promisify(require('child_process').execFile);
Aber wie kann man den Zugriff auf die ursprüngliche return-Wert der ursprünglichen Node.js Funktionen? (In diesen Fällen würde ich brauchen, um in der Lage sein, um Zugriff auf die ursprünglich zurückgegeben ChildProcess Objekte).
Jeder Vorschlag würde geschätzt!
EDIT:
Hier ist ein Beispiel code, der mit der return-Wert der child_process.exec-Funktion:
var exec = require('child_process').exec;
var child = exec('node ./commands/server.js');
child.stdout.on('data', function(data) {
console.log('stdout: ' + data);
});
child.stderr.on('data', function(data) {
console.log('stderr: ' + data);
});
child.on('close', function(code) {
console.log('closing code: ' + code);
});
Aber wenn würde ich die promisified version der exec-Funktion ( execAsync von oben ), dann ist der Rückgabewert ein Versprechen, nicht eine ChildProcess Objekt. Das ist das eigentliche problem von dem ich Rede.
InformationsquelleAutor der Frage Zoltan | 2015-06-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Klingt es wie Sie möchten, um zurückzukehren, zwei Dinge, die aus dem Aufruf:
Also "der empfohlene Weg, um promisify solche Funktionen"? Nicht.
Du bist außerhalb der Konvention. Versprechen der Rückkehr Funktionen werden wieder erwartet Sie ein Versprechen, und das ist es. Sie könnten ein Objekt wieder mit zwei Mitgliedern (den ChildProcess & das Versprechen), werde das aber nur die Leute verwirren.
Ich würde vorschlagen, den Aufruf der unpromisified Funktion und erstellen ein Versprechen, basierend auf der zurückgegebenen childProcess. (Vielleicht wickeln, in eine helper-Funktion)
Diese Weise, es ist sehr explizit für die nächste person, die den code liest.
Etwas wie:
InformationsquelleAutor der Antwort Ivan Hamilton
Wahrscheinlich gibt es nicht eine Möglichkeit, das zu tun schön, dass deckt alle Anwendungsfälle. Aber für den begrenzten Fällen, können Sie etwas wie das hier tun:
Dieser akzeptiert
opts.stdout
undopts.stderr
Argumente, so dass stdio erfasst werden kann von den Kind-Prozess.Beispiel:
Oder einfach:
InformationsquelleAutor der Antwort edan
Möchte nur erwähnen, dass es ein nettes tool, das löst dein problem nicht ganz:
https://www.npmjs.com/package/core-worker
Dieses Paket macht es viel einfacher zu handhaben Prozesse.
oder kombinieren Sie diese Funktionen:
InformationsquelleAutor der Antwort Tobias
Hier ist ein anderer Weg:
Oder mit async/await:
InformationsquelleAutor der Antwort Lacho Tomov