jquery ajax在成功之前拦截或取消成功

时间:2015-11-30 15:54:12

标签: jquery ajax

您好我想在呼叫成功之前添加一个公共处理程序。

例如: 服务器总是发送{errorCode:1,errorMsg:“blah”}之类的数据 如果errorCode == 1那么在公共处理程序中我应该显示一个消息框,并取消成功函数。

编辑: PS:这是一个移交项目,我无法修改架构。

2 个答案:

答案 0 :(得分:2)

您可以创建一个名为ajaxSuccess的函数 - 可以全局访问,它会使用您的附加检查包装ajax成功回调。在此示例中,如果响应包含handleError,则调用errorCode,否则将调用成功回调:

function ajaxSuccess(callback) {
   return function(response, textStatus, xhr) {
      if(typeof response == 'object' && 'errorCode' in response) {
         handleError(response, xhr);
      } else {
         callback.apply(this, arguments);
      }
   };
}

function handleError(error, xhr) {
   alert('AJAX error ' + error.errorCode + ':\n' + error.errorMsg);
}

通过这种方式,您始终可以确保通过ajaxSuccess代理您的成功回调:

$.post(url, data, ajaxSuccess(function(response) {
   alert(response);
}));

我认为这可以让您更好地了解在阅读代码时尝试调试的内容,但是如果您确实想要创建全局处理程序并隐藏ajaxSuccess调用,我想你可以为你设置一个默认的beforeSend监听器:

$.ajaxSetup({
    beforeSend: function(xhr, settings) {
        if('success' in settings && typeof settings.success == 'function') {
            settings.success = ajaxSuccess(settings.success);
        }
    }
});

但请注意,这只是设置默认 beforeSend。如果您进行AJAX调用并确定需要beforeSend其他内容,请手动设置将覆盖默认选项。因此,对于这些场景,您需要记住在ajaxSuccess中手动包装成功回调。

答案 1 :(得分:0)

我认为你正在谈论这样的事情:

$.ajax({
    url:"http://some-post-url.com"
}).done(function(data)
{
    var parsed = $.parseJSON(data);
    if(parsed["errorCode"] == 1) {
        //error code here
    } else {
        //success code here
    }
})

您只需评估该数据服务器响应。