7

在我完成的 jQuery XHR 处理程序(从 $.get() 调用创建)中是否有办法在响应中查找问题,然后使用自定义错误消息触发注册的后续处理程序(谎言失败和始终)?

像这样的东西:

$.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
);

一种二级过滤器就完成了。原因当然是所有在 200 响应中抛出错误的 API,jQuery 永远不会知道这是一个错误。

4

2 回答 2

5

我想出了如何做到这一点,并且效果很好:

$.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
);

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

于 2013-07-23T08:49:23.447 回答
0

感谢您提出这个问题,以及克里斯的回答。

我试过这个并且它有效,除了它触发了一个隐式意外异常(由错误引起)的失败函数,而不是我的测试 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
);
于 2017-07-06T12:18:55.207 回答