[解決済み] BluebirdでNodeのchild_process.execとchild_process.execFile関数をプロミス化する方法とは?
質問
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()
しかし、最近のノードのバージョンでは、より良い答えがあります。
ここで
.
関連
-
[解決済み] JavaScriptで要素のクラスを変更するにはどうすればよいですか?
-
[解決済み] jQueryでページを更新するにはどうすればよいですか?
-
[解決済み] Node.jsを完全にアンインストールして、最初から再インストールする方法 (Mac OS X)
-
[解決済み] Node.jsのmodule.exportsの目的と使い方を教えてください。
-
[解決済み] 兄弟ノードを選択する方法はありますか?
-
[解決済み] CORS OriginヘッダーとCSRFトークンによるCSRF保護
-
[解決済み] コールバック地獄とは何か、RXはそれをどのように、そしてなぜ解決するのか?
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] Promise : then vs then + catch [重複].
-
[解決済み] Fetch: ステータスがOKでない場合、プロミスを拒否し、エラーをキャッチするか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] bootstrap のポップオーバーがすべての要素の上に表示されない
-
[解決済み] node.jsで文字列のsha1ハッシュを取得するにはどうすればよいですか?
-
[解決済み] JavaScriptを使用してHTML要素に属性を追加/更新するには?
-
[解決済み] Javascript 空の配列の削減
-
[解決済み] Javascript / jQueryでAndroid端末を検出する。
-
[解決済み] AngularJS - ngRepeatフィルタリングされた結果の参照を取得する方法
-
[解決済み] Javascriptで動的に命名されたメソッドを呼び出すにはどうすればよいですか?
-
[解決済み] V8 Javascript エンジンのスタンドアロン実行
-
[解決済み] Chrome拡張機能:popup.htmlを強制終了させる
-
[解決済み] 変異を伴わないオブジェクトからの値の削除