2017-04-20 58 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請求開銷相比,我認爲錯誤對象的開銷可以忽略不計。 –

相關問題