2013-07-23 26 views
22

據透露內拒承諾,我剛開始學習jQuery的承諾,所以我可能會有點困惑在這裏。jQuery的遞延:從完成過濾

不管怎麼說,我有我想從完成過濾器內基於響應的內容拒絕AJAX請求:

return doAJAXRequest().then(function (data) { 
    if (data.responseText == "YES") { 
     return doOtherAJAXRequest(); 
    } else { 
     this.reject(data); 
    } 
}); 

這並沒有工作,我預計:

Uncaught TypeError: Object #<Object> has no method 'reject' 

我如何根據其迴應做出承諾失敗?那可能嗎?或者我只是對這裏需要做什麼感到困惑?

+0

嘗試改變this.reject爲$(本).reject。 – rtimoshenko

+0

@rtimoshenko你確定這是對的嗎? – alex

+0

@rtimoshenko這似乎並沒有工作,我仍然得到相同的錯誤。編輯:其實它不完全一樣,但仍然非常相似。 ('Uncaught TypeError:Object [object Object] has no method'reject'') – Ajedi32

回答

31

在jQuery的(不像其他一些庫),transmogrifying從「解決」狀態下的承諾的「拒絕」狀態稍有繁瑣,需要一個新的遞延的明確創建和排斥。

function foo() { 
    return doAJAXRequest().then(function (data, textStatus, jqXHR) { 
     if (data.responseText == "YES") { 
      return doOtherAJAXRequest(data); 
     } else { 
      return $.Deferred().reject(jqXHR, data, 'Not YES').promise(); 
     } 
    }); 
) 

這裏,許返回如果data.responseText !== "YES"模仿(部分)失敗的Ajax請求,但仍允許data傳遞。這是(可能)的下游.fail()處理程序,它必須同時處理真正的AJAX的失敗和成功transmogrified條件,重要的不知道哪一個發生,直到它讀取errorThrown

foo().fail(function(jqXHR, textStatus, errorThrown) { 
    if(errorThrown == 'Not YES') { 
     //transmogrified success 
     var data = textStatus; 
     ... 
    } 
    else { 
     //genuine ajax failure 
     ... 
    } 
}); 

它通常是更容易通過data這種方式,而不是從jqXHR對象重新獲得它。對於JSON編碼數據尤其如此,否則這些數據需要在故障處理程序中第二次解碼。

+2

我不認爲是必要的承諾()部分(或不再),這使得呼叫少一點醜陋/多一點。 – mikus