Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jquery/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在全球范围内扩展jqueryajax成功_Javascript_Jquery_Ajax - Fatal编程技术网

Javascript 在全球范围内扩展jqueryajax成功

Javascript 在全球范围内扩展jqueryajax成功,javascript,jquery,ajax,Javascript,Jquery,Ajax,我试图创建一个在ajax成功回调之前被调用的全局处理程序。我用我的应用程序做了很多ajax调用,如果是错误,我会返回一个特定的结构,因此我需要在成功运行之前运行一些东西来检查响应数据,看看它是否包含类似于1/0的错误代码位 样本响应 {"code": "0", "message": "your code is broken"} 或 我在jQuery开箱即用中找不到实现这一点的方法,查看了预过滤器、ajaxSetup和其他可用方法,但它们并没有完全成功,我可以打赌的是对ajax方法本身进行了一些

我试图创建一个在ajax成功回调之前被调用的全局处理程序。我用我的应用程序做了很多ajax调用,如果是错误,我会返回一个特定的结构,因此我需要在成功运行之前运行一些东西来检查响应数据,看看它是否包含类似于1/0的错误代码位

样本响应

{"code": "0", "message": "your code is broken"}

我在jQuery开箱即用中找不到实现这一点的方法,查看了预过滤器、ajaxSetup和其他可用方法,但它们并没有完全成功,我可以打赌的是对ajax方法本身进行了一些修改:

var oFn = $.ajax;

$.ajax = function(options, a, b, c)
{
    if(options.success)
    {
        var oFn2 = options.success;

        options.success = function(response)
        {
            //check the response code and do some processing
            ajaxPostProcess(response);

            //if no error run the success function otherwise don't bother
            if(response.code > 0) oFn2(response);
        }
    }

    oFn(options, a, b, c);
};

我已经使用它一段时间了,它工作得很好,但是我想知道是否有更好的方法,或者jQuery文档中遗漏了什么。

您可以构建自己的AJAX处理程序,而不是使用默认的AJAX:

var ns = {};
ns.ajax = function(options,callback){ 
    var defaults = {              //set the defaults
        success: function(data){  //hijack the success handler
            if(check(data)){       //checks
                callback(data);   //if pass, call the callback
            }
        }
    };
    $.extend(options,defaults);  //merge passed options to defaults
    return $.ajax(options);             //send request
}
因此,您现在使用的不是
$.ajax
,而是

ns.ajax({options},function(data){
    //do whatever you want with the success data
});

以下是一些建议:

var MADE_UP_JSON_RESPONSE = {
    code: 1,
    message: 'my company still uses IE6'
};

function ajaxHandler(resp) {
    if (resp.code == 0) ajaxSuccess(resp);
    if (resp.code == 1) ajaxFail(resp);
}

function ajaxSuccess(data) {
    console.log(data);
}

function ajaxFail(data) {
    alert('fml...' + data.message);
}

$(function() {

    // 
    // setup with ajaxSuccess() and call ajax as usual
    //
    $(document).ajaxSuccess(function() {
        ajaxHandler(MADE_UP_JSON_RESPONSE);
    });

    $.post('/echo/json/');

    // ----------------------------------------------------
    //             or
    // ----------------------------------------------------

    // 
    // declare the handler right in your ajax call
    //
    $.post('/echo/json/', function() {
        ajaxHandler(MADE_UP_JSON_RESPONSE);
    });
});​

工作:

以下是最基本的示例:

$.ajaxSetup({
    success: function(data){  
        //default code here
    }
});

请随意查看
$.ajaxSetup()

此解决方案使用此技术为每个
$.ajax()
调用透明地添加了一个自定义成功处理程序

(function() {
    var _oldAjax = $.ajax;
    $.ajax = function(options) {
        $.extend(options, {
            success: function() {
                // do your stuff
            }
        });
        return _oldAjax(options);
     };
})();

这是对ajax方法的调用

 function getData(newUrl, newData, callBack) {
           $.ajax({
               type: 'POST',
               contentType: "application/json; charset=utf-8",
               url: newUrl,
               data: newData,
               dataType: "json",

               ajaxSuccess: function () { alert('ajaxSuccess'); },
               success: function (response) {
                   callBack(true, response);
                   if (callBack == null || callBack == undefined) {
                       callBack(false, null);
                   }
               },
               error: function () {
                   callBack(false, null);
               }
           });
       }
在回调成功或方法成功之后

$(document).ajaxStart(function () {
               alert('ajax ajaxStart called');
           });
           $(document).ajaxSuccess(function () {
               alert('ajax gvPerson ajaxSuccess called');
           });

听起来,返回200状态的错误似乎是完全错误的。将HTTP状态设置为正确的错误代码(4xx/5xx),并使用jQuery AJAX
error
handler@Phil验证错误如何?返回4xx或5xx似乎太笼统了。@qwertymk我想这就是我所做的,尽管我更喜欢它们处理旧函数的方式:“return _old.apply(this,arguments);@Rob I+1您的问题,因为您的解决方案对我来说已经足够好了。嗯,是的,问题是我有100个ajax调用,每个调用都“success”如果响应返回良好代码,则运行的代码。我必须转到每个success函数并将此代码包装起来。我更喜欢在success函数中使用干净的代码,而不是让开发团队担心如何包装这些家伙,至少这是我的目标。我给出的
ajaxHandler
函数是全局的。如果使用
ajaxSuccess()
选项,则只需声明一次。是的,但我的成功函数并不完全相同,它们中的许多函数在成功的ajax请求中执行不同的操作。@Rob:您考虑过使用
complete
函数吗?回答不错,但存在一个问题。有时,第三方库(如Backbone.js)使用$.ajax,因此此解决方案不适用于这些情况。@WilsonFreitas:为什么不适用于这些情况?主干是否修改了原始的$.ajax函数?否则我看不出有什么问题。@StanislavPalatnik OP想要的是修改原始的AJAX函数,以便使用它的所有东西都得到自定义配置。我的解决方案只是创建了一个带有自定义配置的新函数,OP可以在其应用程序中全局使用该函数,但不能用于其他库。它说:“为将来的Ajax请求设置默认值。不建议使用它。”$(document).ajaxSuccess(函数(){alert('Ajax gvPerson ajaxSuccess called');});有一件事:我必须将其更改为
options=$.extend(…)
,以使其正常工作。它没有引用
选项
$(document).ajaxStart(function () {
               alert('ajax ajaxStart called');
           });
           $(document).ajaxSuccess(function () {
               alert('ajax gvPerson ajaxSuccess called');
           });