Saltar al contenido

¿Cómo prometer las funciones child_process.exec y child_process.execFile de Node con Bluebird?

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ó.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *