如何在AJAX或XMLHttpRequest调用中识别调用者函数名称?

时间:2017-04-20 16:00:33

标签: javascript jquery ajax performance instrumentation

我试图找出如何识别以编程方式使用JavaScript或jQuery为现有代码库启动Ajax调用的函数名称。

我正在研究现有大型代码库的工具,因此尝试识别与AJAX请求相关的函数名称。所以,已经有很多代码并且修改每个方法似乎并不是最好的方法。所以,我试图考虑一种适用于所有方法的通用方法。代码已经有一个围绕AJAX调用的通用包装器,所以我可以挂钩到方法的入口和出口点。

例如在下面的代码中,在always函数中,我需要知道启动器函数名称或调用堆栈。

function ajaxWrapper(){
var jqxhr = $.ajax( "https://jsonplaceholder.typicode.com/posts/1" )
  .done(function() {
    console.log( "success" );
  })
  .fail(function() {
    console.log( "error" );
  })
  .always(function() {
    console.log( "complete" );
   // TODO: Who Initiated the call ?
  });
}

function initiator1(){
	initiator2();
}

function initiator2(){
	ajaxWrapper();
}

initiator1();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>

我尝试了什么?

  1. 我知道有一种方法是使用beforeSend方法设置自定义标头,并且始终回调接收jqXHR对象作为参数。但这似乎不合适,因为我无法修改所有函数以将方法名称作为参数发送。

  2. arguments.callee.caller方法,但在异步方法的情况下它似乎不起作用。此外,由于性能和安全原因,此功能似乎已被弃用。

  3. 注意:我不会将此信息用于调试目的。我已经知道开发人员工具中提供的异步调用堆栈,Initiator和console.trace解决方案。

1 个答案:

答案 0 :(得分:2)

一个选项是在包装器中生成调用堆栈,因为到那时为止,您处于同步函数调用链中。

var err = new Error();
var stack = err.stack;

稍后在回调中使用它,因为它可用作更高范围的一部分。 (范围不关心异步。)

您需要在该调用堆栈上进行一些解析(不幸的是特定于浏览器)。我不知道您打算如何处理发起人,但您可能希望保留所有链,而不仅仅是第一个链。

另请注意,此技术为unreliable,您不应将其用于任何关键任务。

function ajaxWrapper(){
var err = new Error();
var stack = err.stack;
var jqxhr = $.ajax( "https://jsonplaceholder.typicode.com/posts/1" )
  .done(function() {
    console.log( "success" );
  })
  .fail(function() {
    console.log( "error" );
  })
  .always(function() {
    console.log( "complete" );
    // TODO: Who Initiated the call ?
    console.log(stack);
  });
}

function initiator1(){
	initiator2();
}

function initiator2(){
	ajaxWrapper();
}

initiator1();
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>