2016-04-19 7 views
0

Im mit Electron remote Funktion, um ein Knotenmodul, das eine Bluebird Versprechen zurückgibt. Ich kann jedoch nicht herausfinden, wie die versprochene Rückgabe an den Rendererprozess zurückgegeben wird, der das Modul aufruft.Rückgabe eines Bluebird Versprechen zum Elektronen-Renderer-Prozess

Mit diesem Code ist der Wert return_data1 immer leer.

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

Bitte entfernen Sie den 'java'-Tag. – blafasel

Antwort

0

Sobald Sie in Promises springen, verspricht es ziemlich weit unten. Sie können ein Versprechen auspacken, um zur Callback-Semantik zurückzukehren, aber wenn Sie nicht gerade einen Service für Pre-Promise API schreiben, warum sollten Sie?

In diesem Fall geben Sie nicht data1 zurück; gib das aufgelöste Versprechen zurück. z.B .:

return promiseFromChildProcess(child).then(function (result) { 
    console.log('promise complete: ' + result); 
    return result; 
}, function (err) { 
    console.log('promise rejected: ' + err); 
    return ''; 
}); 

oder wenn der Client mit dem Fehler nur umgehen sollten:

return promiseFromChildProcess(child); 

Es klingt wie vielleicht sind Sie nicht sicher, wie child_process zu verwenden. Die wirklich einfache Art und Weise ist nur stdout nach dem Kind Prozess beendet greifen:

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

so tun:

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

Danke. Das bringt mir ein ausstehendes Versprechen im Elektronenrenderer-Prozess zurück. z.B. Promise {[[PromiseStatus]]: "ausstehend", [[PromiseValue]]: undefined}. Wie komme ich hier zum tatsächlichen Rückgabewert? – user1513388

+0

Sie scheinen auch einen Fehler in Ihrem Code zu haben: 'data.push = {data: data}' sollte wahrscheinlich 'data1.push = {data: data}' sein, obwohl Sie wirklich alle Daten ansammeln und in der child.end event – bknights

+0

siehe weiteres Beispiel für minimales Beispiel für das Sammeln von Verzeichnis – bknights

Verwandte Themen