prosource

인수를 ajax onreadystatechange 콜백으로 전달하시겠습니까?

probook 2023. 2. 12. 18:01
반응형

인수를 ajax onreadystatechange 콜백으로 전달하시겠습니까?

익명의 on readystatechange 콜백에 인수를 전달하는 일반적인 순수 javascript(JQuery가 아님) 방법은 무엇입니까?

예를 들어 다음과 같습니다.

function doRequest(){
    /* Get an XMLHttpRequest in a platform independent way */    
    var xhttp = getXmlHttpRequestObject(); 

    var msg="show this message when done"; /* another variable to pass into callback */

     /* How do I pass 'msg' and 'xhttp' into this anonymous function as locals
       named 'x' and 'm'??? */
    xhttp.onreadychangestate=function(x,m)
    {
       if( x.readyState == 4 )
       {
           alert(m);
       }
    }
    /* do the open() and send() calls here.... */
}

Javascript는 클로징을 지원하므로 귀하가 작성한 익명 함수에 액세스할 수 있습니다.xhttp그리고.msg에워싸고doRequest()범위.

이것을 명시적으로 실시하는 경우(예를 들면, 코드의 다른 장소에 콜백 함수를 정의해 재이용하는 경우)에는, 콜백을 작성하는 함수를 작성할 수 있습니다.이를 통해 다른 이름으로 액세스할 수 있는 변수에 별칭을 지정할 수도 있습니다(예:x그리고.m):

function createCallback(x, m) {
    return function() {
        /* Do whatever */
    };
}

그리고 나서doRequest(),하다xhttp.onreadystatechange = createCallback(xhttp, msg);

변수를 '이름 변경'하는 것만으로 다음 작업을 인라인 및 익명으로 수행할 수 있습니다.

xhttp.onreadystatechange = (function(x, m) {
    return function() {
        /* Do stuff */
    }
})(xhttp, msg);

위의 답변 중 일부는 나에게 효과가 없었다.우선 파라미터가 없는 개별 callBack 함수의 경우:

 xhttp.onreadystatechange = callBack;   //works; the function's NAME is required

다음으로 몇 가지 파라미터를 수신하도록 callBack 함수가 변경되었다고 가정합니다.

 xhttp.onreadystatechange = callBack(x,m); //didn't work, and didn't know why
 xhttp.onreadystatechange = createCallback(xhttp,msg); //bad part of above Answer

단, StackOverflow의 다른 곳에서는 onreadystate change에 대해 "함수 호출"이 아닌 "함수 참조"를 할당해야 한다고 설명하고 솔루션을 게시했습니다.

 xhttp.onreadystatechange = function(){callBack(x,m);}; //works

다른 답변에 뭔가를 추가하려고 왔는데, 지금 찾을 수 없습니다.그래서 여기에 추가하는 게 나을 것 같아요.제 코드로 로컬 변수와 글로벌 변수를 모두 사용하다가 제대로 작동하지 않는 것을 발견했습니다. 하지만 이제 무슨 일이 일어났는지 알게 되었습니다. Word Of Warning이 적절해 보입니다.g가 글로벌 변수라고 가정합니다.

 xhttp.onreadystatechange = function(){callBack(x,g);};//anonymous function works

함수 참조는 특정 시점(T0)에 onready state change에 할당되어 다른 시각(T1)에 callBack 함수가 호출됩니다.T1에서의 글로벌 변수 "g" 값은 callBack 함수에 전달되는 값이지 함수 참조가 T0에 할당되었을 때의 "g" 값이 아닙니다.(로컬 변수는 보통 T1에서 범위를 벗어나기 때문에 어나니머스 함수의 파라미터 값을 설정할 때 JavaScript는 T0에서 기존 값을 사용해야 하기 때문에 일반적으로 이 문제가 발생하지 않습니다.)

늦지 마세요! :-)

다소 복잡한 xhttp.onreadystatechange 인수를 사용하여 데이터를 전달하는 대신 xhr 객체 자체에 속성을 추가할 수 있습니다.

예:

var m = "Hello!";
var xhttp = new XMLHttpRequest();
xhttp.m = m;
xhttp.onreadystatechange = function()
{
    var x, m;
    x = this;
    m = x.m;
    if ((x.readyState == 4) && (x.status == 200))
    {
        alert(m);
    }
};
// ...

언급URL : https://stackoverflow.com/questions/8582663/pass-arguments-into-ajax-onreadystatechange-callback

반응형