1. ホーム
  2. javascript

[解決済み] BluebirdでNodeのchild_process.execとchild_process.execFile関数をプロミス化する方法とは?

2022-08-20 06:35:35

質問

Node.jsでBluebird promise libraryを使用しています。しかし、質問があります。

Nodeのドキュメントを見てみると child_process.exec child_process.execFile を見ると、これらの関数が両方ともChildProcessオブジェクトを返していることがわかります。

では、このような関数をプロミシングするために推奨される方法は何でしょうか?

なお、以下のようにするとうまくいきます(プロミスオブジェクトが得られます)。

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

しかし、どのようにしてオリジナルのNode.js関数の戻り値にアクセスできるのでしょうか?(このような場合、私はもともと返されたChildProcessオブジェクトにアクセスできる必要があります)。

どんな提案でも感謝します!

EDITです。

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オブジェクトではなく、プロミスになるでしょう。これは私が話している本当の問題です。

どうすれば解決するのか?

呼び出しから2つのものを返したいようですね。

  • 子プロセス
  • ChildProcessが完了したときに解決するプロミス

では、このような関数をプロミス化するおすすめの方法は何でしょうか? しない .

規約から外れていますね。プロミスを返す関数は、プロミスを返すことを期待されています。2つのメンバー(ChildProcess & 約束)を持つオブジェクトを返すことができますが、それは人々を混乱させるだけでしょう。

私は、プロミス化されていない関数を呼び出し、返されたchildProcessを基にプロミスを作成することを提案します。(多分、それをヘルパー関数にラップする)

この方法では、コードを読む次の人のために非常に明示的です。

のようなものです。

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

具体的にプロミス化したいだけなら child_process.exec()child_process.execFile() しかし、最近のノードのバージョンでは、より良い答えがあります。 ここで .