2013-03-10 40 views
8

jQuery的AJAX .fail()是一個很好的錯誤處理程序,它可以處理「404 Not Found」錯誤等,但是我們怎樣才能從.done()內部故意調用它來處理一般錯誤情況,例如,當用戶提供的數據不正確時?如何從.done()內部調用.fail()來處理一般錯誤?

+2

一旦'.done()'被執行並且你在回調中,決定在相同的promise對象上執行'.fail()'是否太遲了?您應該使用更傳統的JavaScript錯誤處理,例如異常或錯誤檢查,或將自己的錯誤回調放在對象上。 – jfriend00 2013-03-10 08:22:15

回答

10

您可以在每種情況下使用在錯誤時調用的通用函數。

$.ajax('url') 
    .done(function(data, textStatus, jqXHR) { 
     if(data == 'Invalid') { 
      ajaxError(jqXHR, "usererror"); 
     } 
    }) 
    .fail(ajaxError); 

function ajaxError(jqXHR, textStatus, errorThrown) { 
    console.log('Ajax error: ' + textStatus); 
} 
3

@ Juhana的代碼對大多數情況都是很好的。

但是,如果可能出現的錯誤不能由data檢查能夠可靠地預測獨自一人,然後再考慮這個變體:

$.ajax('url').done(function(data, textStatus, jqXHR) { 
    try { 
     var dataLooksGood = ......;//(boolean) Test data for predictable data errors here 
     if(!dataLooksGood) throw(new Error("data invalid");) 
     //Handle data here. 
     //Any naturally-ocurring errors or further manually-thrown errors will be caught below. 
    } 
    catch(err) { 
     ajaxError(jqXHR, "AJAX successful but: " + err.message); 
    } 
}).fail(ajaxError).always(function() { 
    //Here do whatever is necessary after success or error 
}); 


function ajaxError(jqXHR, textStatus, errorThrown) { 
    console.log('AJAX error: ' + textStatus); 
} 

通過捕獲錯誤,always處理程序將被允許即便不可預測的火錯誤發生。因此,無論發生什麼錯誤,您都可以更好地保證「加載...」消息或微調圖形被殺死。

相關問題