2014-10-08 34 views
5

我有這樣的功能:如何函數調用轉換有兩個回調答應

var f = function(options, successCallback, errorCallback) { 
    ... 
} 

,我希望把它轉換的號召,一個承諾。我目前的解決辦法是這樣的:

var deferred = Q.defer(); 

f(options, 
    function (result) { 
     deferred.resolve(result); 
    }, function (err) { 
     deferred.reject(err); 
    } 
); 

return deferred.promise; 

,因爲它需要一個Node.js的風格回調function(err, result) { ... }

所以我不能使用Q.fcall,有沒有使用Q API來提高我的代碼的方式?

回答

4

不,所有這些幫助函數(基於Deferred.makeNodeResolver)僅用於處理醜陋的nodebacks。如果回調風格的方法已經取得了不同的成功和錯誤回調,那麼不需要做太多額外的工作。

你可以通過刪除那些不必要的關閉函數表達式簡化您的模式:

var deferred = Q.defer(); 
f(options, deferred.resolve, deferred.reject); 
return deferred.promise; 

您也可以使用Promise constructor,這是承諾創造的首選方法(獎金:捕獲異常throw N乘f):

return new Q.Promise(function(resolve, reject) { 
    f(options, resolve, reject); 
}); 

其甚至可以與局部應用縮短到

return new Q.Promise(f.bind(null, options)); 

又見通用參考:How do I convert an existing callback API to promises?

+0

哇!優秀的答案,謝謝, – bniwredyc 2014-10-08 10:44:23