2013-02-18 78 views
2

我正在準備一些演示文稿的示例材料,其中也涵蓋了jQuery承諾的基礎知識,並且我正在計算一些奇怪的行爲。希望你們能幫我解決這個問題。jQuery Promises arguments failed callback undefined

我有以下代碼,它工作得很好。

var getHTML1 = $.ajax({ 
     url: "jquerypromises.html",  
     type: "GET" 
}); 

getHTML1.done(function(responseText, state, jqXHR){ 
    console.log("success from AJAX request with promises : getHTML1!"); 
}); 

getHTML1.fail(function(){ 
    console.log("error from AJAX request with promises : getHTML1!"); 
}); 

//this one will call the failure callback!!!!!! 
var getHTML2 = 
$.ajax({ 
     url: "somenonexistingpage.html", //<== THIS WILL call the failure callback 
     type: "GET" 
}) 
.then(
    function(){ 
     console.log("success from AJAX request with promises : getHTML2!"); 
    } 
, 
    function(jqXHR, state){ 
     console.log("error from AJAX request with promises : getHTML2!"); 
    } 
); 

此代碼運行作爲espected爲getHTML1的完成處理程序被調用和getHTML2故障處理程序被調用。

現在,當我在上面看到的代碼下面添加以下代碼時。

$.when(getHTML1, getHTML2).then(
    function(response1, response2) { 
     // both arguments are arrays with[responseText, "success", jqXHR] 
     console.log("Both promises went successfull"); 
     console.dir(response1); 
     console.dir(response2); 
    }, 
    function(jqXHR, status) { 
     console.log("One of both promises went wrong!");   
     console.log(jqXHR); 
     console.log(status);   
    } 
); 

再次調用正確的處理程序。在這種情況下,失敗回調被調用,但它的所有參數都是未定義的。爲什麼是這樣?

現在,當我刪除了故障處理程序中then()getHTML2代碼變成這樣:

var getHTML2 = 
$.ajax({ 
     url: "somenonexistingpage.html", //<== THIS WILL call the failure callback 
     type: "GET" 
}) 
.then(
    function(){ 
     console.log("success from AJAX request with promises : getHTML2!"); 
    } 
); 

現在一切正常像預期,在第二故障處理程序則()塊被調用充滿了爭論。

測試在Chrome中使用jQuery 1.9.1

回答

0

基本上,這是因爲then()的文件說(重點煤礦):

這些過濾函數可以返回一個新值要傳承下去到 承諾的.done().fail()回調,或者他們可以返回另一個 可觀察對象(延遲,承諾等),該對象將其 已解決/拒絕的狀態和值傳遞給承諾的回調。如果 所使用的過濾器功能是null,或未指定,承諾將 解析或拒絕與原始相同的值。

所以,你可以從失敗過濾器返回一個值,這是不是你想要的(你想兩個值)或完全忽略失敗濾波器具有then()傳遞相同的值作爲當初的諾言。

如果你想實現一個失敗的過濾器,返回多個值,就可以返回一個新的Deferred對象您立即使用這些值拒絕:

var getHTML2 = $.ajax({ 
    url: "somenonexistingpage.html", //<== THIS WILL call the failure callback 
    type: "GET" 
}).then(function() { 
    console.log("success from AJAX request with promises : getHTML2!"); 
}, function(jqXHR, state) { 
    console.log("error from AJAX request with promises : getHTML2!"); 
    return $.Deferred().reject(jqXHR, state); 
}); 
+0

完美。謝謝 – 2013-02-18 16:09:03