2017-04-20 5 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. 私は1つのアプローチはbeforeSend方法でカスタムヘッダーを設定し使用していると常にコールバックは、パラメータとしてjqXHRオブジェクトを受け取る知っています。しかし、メソッド名をパラメータとして送るためにすべての関数を変更することはできないので、これは適切なアプローチではないようです。

  2. arguments.callee.callerですが、非同期方式の場合は動作しません。また、この機能は、パフォーマンスとセキュリティ上の理由から推奨されていないようです。

注:この情報はデバッグ目的ではありません。私はすでにAsyncのコールスタック、Initiator、および開発者ツールで利用可能なconsole.traceソリューションを認識しています。

答えて

2

1つのオプションは、同期関数呼び出しチェーン内にあるので、ラッパー内にコールスタックを生成することです。

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私が思うと、Errorオブジェクトのオーバーヘッドは、HTTPリクエストのオーバーヘッドに比べて無視できるものです。 –

関連する問題