2017-04-20 62 views
3

我想了解如何识别以编程方式使用JavaScript或jQuery为现有代码库启动Ajax调用的函数名称。如何识别AJAX或XMLHttpRequest调用中的调用者函数名称?

我正在研究现有的大型代码库的工具,因此试图确定与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(){ 
 
\t initiator2(); 
 
} 
 

 
function initiator2(){ 
 
\t 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方法,但在异步方法的情况下似乎不起作用。此外,由于性能和安全原因,此功能似乎已被弃用。

注意:我没有看这个信息用于调试目的。我已经意识到开发人员工具中提供的Async调用堆栈,Initiator和console.trace解决方案。

回答

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(){ 
 
\t initiator2(); 
 
} 
 

 
function initiator2(){ 
 
\t ajaxWrapper(); 
 
} 
 

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

+0

+1感谢阿林,你知道创造了很多错误的对象,因为我需要这个代码添加到通用Ajax调用的任何性能意味着什么呢?如果在功能上或技术上没有错误,创建一个Error对象是否是好习惯? – Agalo

+0

@Agalo与他们所附带的HTTP请求开销相比,我认为错误对象的开销可以忽略不计。 –

相关问题