jQuery AJAX或XHR请求触发完成回调的失败回调

时间:2013-07-23 00:31:20

标签: jquery

在我的jQuery XHR(从$ .get()调用创建)的done处理程序中是否存在一种方法来查找响应中的问题,然后使用自定义触发已注册的后续处理程序(谎言失败和总是)错误消息?

类似的东西:

$.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永远不会知道这是一个错误。

2 个答案:

答案 0 :(得分: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
);

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

答案 1 :(得分:0)

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

我试过这个并且它有效,除了它触发了一个隐式意外异常(由bug引起)的失败函数,而不是我的测试AJAX异常。这让我想到了,它可能适用于显式异常而无需创建新的promise对象的麻烦。所以我虽然会尝试一次明确的投掷 - 但它确实有效。

这个显式抛出在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
);