我使用Electron的remote
函数来调用返回bluebird promise的节点模块。但是,我无法弄清楚如何将promise返回给调用模块的渲染器进程。
使用此代码,return_data1
的值始终为空。
exports.call_python = function () {
data1 = []
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);
data.push={data: data}
});
child.stderr.on('data', function (data) {
console.log('stderr: ' + data);
});
child.on('close', function (code) {
console.log('closing code: ' + code);
});
return data1
};
答案 0 :(得分:0)
一旦你进入Promise,它几乎都是承诺。您可以解包Promise以回到回调语义,但除非您为pre-Promise API编写服务,为什么要这样做?
在这种情况下不要返回data1;返回已解决的承诺。 e.g:
return promiseFromChildProcess(child).then(function (result) {
console.log('promise complete: ' + result);
return result;
}, function (err) {
console.log('promise rejected: ' + err);
return '';
});
或者如果客户端应该只处理错误:
return promiseFromChildProcess(child);
听起来好像你不确定如何使用child_process。真正简单的方法是在子进程退出后抓住stdout:
var b = require('bluebird');
var cp = require('child_process');
new b(function(resolve, reject){
cp.exec('dir', function(err, stdout, stderr){
resolve(stdout);
});
}).then(function(data){
console.log("dir is "+data);
});
所以:
exports.call_python = function () {
var b = require('bluebird');
var cp = require('child_process');
return new b(function(resolve, reject){
cp.exec('ls', function(err, stdout, stderr){
resolve(stdout);
});
});
};