2015-11-13 84 views
1

使用Promise.resolve($.ajax(options))如上所述http://bluebirdjs.com/docs/api/promise.resolve.html不起作用。BluebirdJS承諾jQuery不能正常工作

var $ = require('jquery'); 
var Promise = require('bluebird'); 

function makeRequest(options) { 

     return Promise.resolve($.ajax(options)) 
     .then(function(data) { return data; }, 
       function (error) { return error; }); 

} 

當我打電話和網址(在這種情況下,403)返回一個錯誤,我添加一個「然後」,它總是調用完成處理程序。

makeRequest(options).then(iAmBeingCalledWhenTheRequestFails, iAmNotBeingCalled); 

回答

3

當你這樣做:

return Promise.resolve($.ajax(options)) 
    .then(function(data) { return data; }, 
      function (error) { return error; }); 

這是切實做好:

try { 
    return $.ajax(options); 
} catch (e){ 
    return e; 
} 

承諾有異常處理像普通的同步碼,當你return形成你從錯誤中恢復的異常處理程序(如嘗試捕捉)。如果你想添加一個錯誤處理程序保持鏈處於拒絕狀態 - 你需要throw這個錯誤。

更好的是,不要在這種情況下附加錯誤處理程序開始。

return Promise.resolve($.ajax(options)); // that's all folks! 
+0

「當你返回一個異常處理程序,你從錯誤中恢復(如try catch)」。非常感謝,我認爲我錯過了諾言(這是你認爲你知道的事情之一,但實際上卻沒有)。 –

+2

@WalterMacambira沒關係--jQuery非常有名[錯過了自己的諾言](https://gist.github.com/domenic/3889970)。 –

+0

對於拋出錯誤只是爲了拋出錯誤而不是壞的表現? –