返回蓝鸟承诺电子渲染过程

时间:2016-04-19 13:52:33

标签: javascript node.js bluebird electron

我使用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
 };

1 个答案:

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