一尘不染

如何使用Bluebird来实现Node的child_process.exec和child_process.execFile函数的功能?

node.js

我正在Node.js下使用Bluebird Promise库,太好了!但是我有一个问题:

如果查看一下Node的child_process.execchild_process.execFile的文档,您会发现这两个函数都返回一个ChildProcess对象。

那么推荐这种功能的推荐方法是什么?

请注意以下工作(我得到一个Promise对象):

var Promise = require('bluebird');
var execAsync = Promise.promisify(require('child_process').exec);
var execFileAsync = Promise.promisify(require('child_process').execFile);

但是如何获得原始Node.js函数的原始返回值?(在这些情况下,我将需要能够访问最初返回的ChildProcess对象。)

任何建议,将不胜感激!

编辑:

这是使用child_process.exec函数的返回值的示例代码:

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);
});

但是,如果我使用exec函数的承诺版本(上面的execAsync),则返回值将是一个承诺,而不是ChildProcess对象。这是我正在谈论的真正问题。


阅读 284

收藏
2020-07-07

共1个答案

一尘不染

听起来您想从通话中返回两件事:

  • 子进程
  • 当ChildProcess完成时解决的承诺

那么,“推荐这种功能的推荐方法”呢? 不要

您不符合常规。承诺返回函数将返回承诺,仅此而已。您可以返回一个具有两个成员的对象(ChildProcess和Promise),但这只会使人们感到困惑。

我建议调用unpromisified函数,并基于返回的childProcess创建一个promise。(也许将其包装到一个辅助函数中)

这样,对于下一个阅读该代码的人来说是非常明确的。

就像是:

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);
});
2020-07-07