当前位置: 首页 > 面试题库 >

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

公良文彬
2023-03-14
问题内容

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

如果查看一下Node的child_process.exec和child_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对象。这是我正在谈论的真正问题。


问题答案:

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

  • 子进程
  • 当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);
});


 类似资料:
  • 本文向大家介绍使用lua实现php的print_r()函数功能,包括了使用lua实现php的print_r()函数功能的使用技巧和注意事项,需要的朋友参考一下 之前写了一些类似php的函数,下面再来一个print_r()函数,代码如下:

  • 本文向大家介绍使用lua实现php的var_dump()函数功能,包括了使用lua实现php的var_dump()函数功能的使用技巧和注意事项,需要的朋友参考一下 习惯了php中的var_dump()函数,而如今写lua的时候总习惯使用var_dump()函数,于是就自己动手写了一个类似功能的var_dump()函数。

  • 问题内容: 我想在回调中提供node-postgres的方法以及内部方法。 我可以使用后者,但是我需要手动实现第一个(如果我在这里缺少什么,请解释一下)。 问题是,我不确定此代码是否正确或应该改进?该代码有效,我只想知道我是否按预期使用了Bluebird。 问题答案: 丢掉所有可怕的回调代码,然后在应用程序初始化的某个位置执行此操作: 以后在任何地方都可以使用pg模块,就好像它被设计为使用prom

  • 问题内容: 在Bluebird的文件中,它具有以下功能: 由于某种原因,在return函数之后有一条语句,我不确定为什么会在其中。 同样,这似乎是有意的,因为作者已对此静默了JSHint警告: “返回”后无法到达“评估”。(W027) 此功能的作用是什么?难道真的让一个对象的属性“快”? 我已经在Bluebird的GitHub存储库中搜索了源代码中的任何注释或问题列表中的解释,但找不到任何注释。

  • 本文向大家介绍Python enumerate() 函数如何实现索引功能,包括了Python enumerate() 函数如何实现索引功能的使用技巧和注意事项,需要的朋友参考一下 1.描述: enumerate()函数用于将一个可遍历的数据对象(如列表,元组,字符串)组合为一个索引序列,同时列出数据和数据索引(下标),一般用于for循环当中 2.语法 enumerate(sequence, [st

  • 问题内容: 我尝试将Angular与Bluebird Promise一起使用: HTML: JS: [ 小提琴 ] 但是,无论我尝试了什么,它都保持不变并且没有更新。除非我添加了手册,否则我会避免使用。 如何让Bluebird与AngularJS一起使用? (我知道这是可能的,因为$ q可以这样做) 我正在使用Bluebird2.0,我在这里。 问题答案: 这是可能的,甚至很容易! 好吧,如果我们