2016-04-13 13 views
0

私はbluebird promiseを持っています。このチェックが真であれば、それは継続することができます。ただし、このチェックが偽の場合は、非同期プロセスspawnが必要です。続行する前に完了するまで待つ必要があります。ブルーバードの約束の中でオプションのプロセス操作を待っています

私は次のようなものを持っている:

var foo = getPromise(); 

foo.spread(function (error, stdout, stdin) { 
    if (error) { 
     // ok, foo needs to hold on until this child exits 
     var child = spawn(fixerror); 
     child 
      .on('error', function (e) { 
       //I need to error out here 
      }) 
      .on('close', function (e) { 
       //I need to have foo continue here 
      }); 
    } else { 
     return "bar"; 
    } 
}); 

は、どのように私はそれをやって行くのでしょうか?

+0

あなたの '.spread()'ハンドラは、最初の引数として 'error'を持つ関数を取るのはなぜですか?それはあまり有望ではないようです。通常、エラーは約束を拒否し、解決することはありません。 – jfriend00

+0

@ jfriend00:他の2つのパラメータ名が与えられていると、私には 'stderrString'のように聞こえます。外部プロセスが実行され、すべてうまくいったが、何かを標準エラー出力に書き込んだ。 – Bergi

+0

可能な複製[既存のコールバックAPIを約束に変換するにはどうすればいいですか?](http://stackoverflow.com/q/22519784/1048572) - そこには何もない場合は、あなたの質問を[編集]してくださいどのようにあなたの試行がうまくいかなかったか。 – Bergi

答えて

1

最初に、.spread()ハンドラは、最初の引数としてerrorでコールバックを取るのですか?それは正しいとは思わない。エラーが発生すると拒否され、履行が行われません。

実際にあなたのコードの仕組みだった場合は、.spread()ハンドラの中から約束を返す必要があります。その約束は、元の約束にチェーンを取得し、両方が行われたときには、見ることができます:

getPromise().spread(function (error, stdout, stdin) { 
    if (error) { 
     // ok, foo needs to hold on until this child exits 
     return new Promise(function(resolve, reject) { 
      var child = spawn(fixerror); 
      child.on('error', function (e) { 
       //I need to error out here 
       reject(e); 
      }).on('close', function (e) { 
       // plug-in what you want to resolve with here 
       resolve(...); 
      }); 
     }); 
    } else { 
     return "bar"; 
    } 
}).then(function(val) { 
    // value here 
}, function(err) { 
    // error here 
}); 

しかし、おそらく、あなたの.spread()ハンドラがありerror引数を持つべきではありません、それは代わりに拒絶反応を起こす必要があります元の約束:

getPromise().spread(function (stdout, stdin) { 
    // ok, foo needs to hold on until this child exits 
    return new Promise(function(resolve, reject) { 
     var child = spawn(fixerror); 
     child.on('error', function (e) { 
      //I need to error out here 
      reject(e); 
     }).on('close', function (e) { 
      // plug-in what you want to resolve with here 
      resolve(...); 
     }); 
    }); 
}).then(function(val) { 
    // value here 
}, function(err) { 
    // error here 
}); 
+0

エラーが発生しました。このエラーは、thenを使用する代わりにエラーを拒否し、キャッチを使用して解決策を管理しました。 – MirroredFate

1

スポーン又は約束機能における任意の他の代替経路をラップ、次いで、(サンプルコード)のような流れを保つ:

promiseChain 
    .spread((stderr, stdout, stdin) => stderr ? pSpawn(fixError) : 'bar') 
    .then(... 

// example for promisified spawn code: 
function pSpawn(fixError){ 
    return new Promise((resolve, reject) => {   
     spawn(fixError) 
      .on('error', reject) 
      .on('close', resolve.bind(null, 'bar'))   
    }) 
} 
関連する問題