2013-07-23 153 views
7

有没有办法在我完成处理程序的jQuery XHR(从$ .get()调用创建)来查找响应中的问题,然后触发注册的后续处理程序(谎言失败&总是)与自定义错误消息?jQuery AJAX或XHR请求触发失败从回调完成回调

是这样的:

$.get(URL) 
.done(
    function (data, status, res) { 
    if(/*some condition*/){ 
      this.Reject(res, status, "some reason"); 
      return  
     } 
    //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 

上做了二次过滤器的种类。原因当然是所有的API在200响应中推送错误,jQuery永远不会知道这是一个错误。

+0

工作没有没有!失败方法在ajax调用期间失败时执行。服务器端的错误仍会通过有效的响应,但不会被视为错误。如果您的服务器端代码失败,您可以通过传递无效内容或400头或其他任何会触发失败方法的触发器来触发失败方法,但是您无法在done方法中调用它,并且它不适合做任一。 – adeneo

+1

这怎么不合适?期货/承诺/任务能够触发错误回调很常见。 –

+0

是的,但是如果你创建了一个promise,它可以被拒绝来触发失败方法,在ajax调用中,fail方法让你知道调用本身出了问题,而来自服务器的任何有效响应都是成功的ajax调用。在服务器端发生的任何错误都无法输出,无论您的预期如何,都应该在成功处理程序中找到。或者至少这是通常的做法,因为您无法从完成的方法触发失败方法,因为承诺已经在那个时候解决了。 – adeneo

回答

4

我想出如何做到这一点,它工作得很好:

$.get(URL) 
.then(
    function (data, status, res) { 
     if(/**some error check**/({ 
      return $.Deferred().reject(res, status, "error message"); 
     } 

     return $.Deferred().resolve(data, status, res); 
    } 
) 
.done(
    function (data, status, res) { 
     //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
); 

的作品就像一个魅力,现在我没有杂乱的数据错误处理在我做的,我可以只专注于处理数据或设置错误消息。

0

感谢这个问题,克里斯的回答。

我试过这个,它工作,除了它触发了一个隐式的意外异常(由一个bug引起)的失败函数,而不是我的测试AJAX异常。这让我想到,它可能适用于明确的异常,而无需创建新的承诺对象。所以我尽管我会尝试一个明确的投掷 - 它的工作。

这个显式投掷在jQuery 3中起作用。我不确定早期版本。我想在一个done处理这样做的,它没有工作:扔似乎只在then处理

$.get(URL) 
.then(
    function (data, status, res) { 
     if(/**some error check**/({ 
      throw "error message"; 
     } 

     return data; //this is also important 
    } 
) 
.done(
    function (data, status, res) { 
     //Do stuff on success 
    } 
) 

.fail(
//Common error handler here 
) 
.always(
    //common always handler here 
);