No olvides que en las ciencias informáticas un problema puede tener más de una soluciones, así que nosotros aquí enseñaremos lo mejor y más eficiente.
Solución:
Recomendaría usar promesas JS estándar integradas en el lenguaje sobre una dependencia de biblioteca adicional como Bluebird.
Si usa Node 10+, los documentos de Node.js recomiendan usar util.promisify
que devuelve un Promise< stdout, stderr >
objeto. Vea un ejemplo a continuación:
const util = require('util');
const exec = util.promisify(require('child_process').exec);
async function lsExample()
try
const stdout, stderr = await exec('ls');
console.log('stdout:', stdout);
console.log('stderr:', stderr);
catch (e)
console.error(e); // should contain code (exit code) and signal (that caused the termination).
lsExample()
Manejar errores primero desde stderr
.
Parece que te gustaría devolver dos cosas de la llamada:
- el proceso infantil
- una promesa que se resuelve cuando el ChildProcess se completa
Entonces, ¿”la forma recomendada de prometer tales funciones”? No.
Estás fuera de la convención. Se espera que las funciones de devolución de promesa devuelvan una promesa, y eso es todo. Puede devolver un objeto con dos miembros (el ChildProcess y la promesa), pero eso solo confundirá a las personas.
Sugeriría llamar a la función no prometida y crear un basado en promesas fuera del childProcess devuelto. (Tal vez envuelva eso en una función de ayuda)
De esta forma, es bastante explícito para la próxima persona que lea el código.
Algo como:
var Promise = require('bluebird');
var exec = require('child_process').execFile;
function promiseFromChildProcess(child)
return new Promise(function (resolve, reject)
child.addListener("error", reject);
child.addListener("exit", resolve);
);
var child = exec('ls');
promiseFromChildProcess(child).then(function (result)
console.log('promise complete: ' + result);
, function (err)
console.log('promise rejected: ' + err);
);
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);
);
Aquí hay otra manera:
function execPromise(command)
return new Promise(function(resolve, reject)
exec(command, (error, stdout, stderr) =>
if (error)
reject(error);
return;
resolve(stdout.trim());
);
);
Usa la función:
execPromise(command).then(function(result)
console.log(result);
).catch(function(e)
console.error(e.message);
);
O con async/await:
try
var result = await execPromise(command);
catch (e)
console.error(e.message);
valoraciones y reseñas
No se te olvide dar recomendación a este ensayo si te ayudó.