0

我想使用一些特殊情况处理程序扩展我的所有应用程序的 ajax 调用,并且如果需要,能够重新触发启动 ajax 调用的方法。我遇到的问题是我无法从我的匿名函数事件处理程序(ajaxSend 或 ajaxSuccess)获取触发 ajax 调用的调用函数的名称。我已经尝试了下面评论的所有调用者/被调用者的变体以及许多其他变体。这是一些示例代码:

  var ajaxcaller;
  $(document).ajaxSend(function(event,xhr,settings){
       // Before we fire off our call lets store the caller.
       // ajaxcaller = arguments.callee.caller.name;          
       //alert("get caller:"+arguments.callee.caller.name);
       //alert("get caller:"+caller.name);
       //alert("get caller:"+this.caller.toString());
       //alert("get caller:"+event.caller.toString());
  });
  $(document).ajaxSuccess(function(event,xhr,settings){
       var xobj = $.parseJSON(request.responseText);
       if(xobj.ReFire === 1){
           //Successful ajax call but not results we expected, let's refire
           //Fix some params automagically here then
           //SOME CODE HERE THAT Refires my caller
        }
  });
  $(document).ajaxError(function(event,xhr,settings){
       var xobj = $.parseJSON(request.responseText);
       if(xobj.ReFire === 1){
           //Fix some params automagically here then
           //SOME CODE HERE THAT Refires my caller
        }
  });
4

1 回答 1

0

这是一个想法,但是我不确定它有多可靠,但是您可以拦截jQuery.ajax调用并将一个caller属性附加到options引用调用函数的args属性以及引用传递给该函数的参数的属性。

我相信,如果你尝试这个想法,你会找到解决问题的方法。如果您不喜欢覆盖的想法jQuery.ajax,您可以简单地确保在所有 ajax 调用中将这些引用作为选项传递。

演示:http: //jsfiddle.net/zVsk2/

jQuery.ajax = (function (fn) {
    return function (options) {
        var caller = arguments.callee.caller;
        options.caller = caller;
        options.args = caller.arguments;
        return fn.apply(this, arguments);
    };
})(jQuery.ajax);

$(document).ajaxSend(function (e, xhr, options) {
    console.log('caller', options.caller);
    console.log('args', options.args);
});

function getRecords(someArgument) {
    return $.ajax({
        url: '/echo/json/',
        dataType: 'json',
        data: {
            json: JSON.stringify({ test: someArgument})
        }
    });
}

getRecords(1);
getRecords(2);
于 2013-04-29T22:08:35.627 回答