2013-03-10 47 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处理程序将被允许即便不可预测的火错误发生。因此,无论发生什么错误,您都可以更好地保证“加载...”消息或微调图形被杀死。

相关问题