我试图找出如何识别以编程方式使用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>
我尝试了什么?
我知道有一种方法是使用beforeSend
方法设置自定义标头,并且始终回调接收jqXHR
对象作为参数。但这似乎不合适,因为我无法修改所有函数以将方法名称作为参数发送。
arguments.callee.caller
方法,但在异步方法的情况下它似乎不起作用。此外,由于性能和安全原因,此功能似乎已被弃用。
注意:我不会将此信息用于调试目的。我已经知道开发人员工具中提供的异步调用堆栈,Initiator和console.trace解决方案。
答案 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>