首先爲什麼您的.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
});
爲什麼'.spread()'處理函數將一個帶有'error'的函數作爲第一個參數?這看起來並不像諾言。通常,錯誤會導致承諾拒絕,而不是解決。 – jfriend00
@ jfriend00:聽起來像'stderrString'給我,給出另外兩個參數名稱。一個外部過程被執行,一切都很順利,但它確實寫了一些東西給stderr。 – Bergi
[如何將現有的回調API轉換爲承諾?](http://stackoverflow.com/q/22519784/1048572) - 如果有任何未覆蓋的地方,請用您的問題解釋您的問題你的嘗試如何不起作用。 – Bergi