2017-04-20 1 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 접근 방식이지만 비동기 방식의 경우에는 작동하지 않는 것 같습니다. 또한이 기능은 성능 및 보안상의 이유로 더 이상 사용되지 않는 것 같습니다.

참고 : 디버깅 용도로이 정보를 찾고 있지 않습니다. 개발자 도구에서 사용할 수있는 비동기 호출 스택, 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

한 덕분에 알린, 당신은 내가 일반 아약스 래퍼에이 코드를 추가 할 필요가 같은 오류 객체를 많이 생성의 성능 의미를 알 수 있습니까? 기능적으로나 기술적으로 오류가없는 경우 Error 객체를 만드는 것이 좋습니다. – Agalo

+0

@Agalo 내가 생각하는 Error 객체 오버 헤드는 그들이 첨부 된 HTTP 요청 오버 헤드와 비교할 때 무시할 만하다. –

관련 문제