2011-12-20 24 views
20

Jaki jest normalny czysty javascript (tj. Nie JQuery) sposób przekazywania argumentów do anonimowego wywołania zwrotnego onreadystatechange?Przekazywać argumenty do wywołania zwrotnego ajax onreadystatechange?

Na przykład:

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.... */ 
} 

Odpowiedz

31

obsługuje JavaScript zamknięć, więc anonimowa funkcja napisałeś będzie w stanie uzyskać dostęp xhttp i msg z otaczającą doRequest() zakresie.

Jeśli chcesz to zrobić jawnie (powiedz, jeśli chcesz zdefiniować funkcję zwrotną gdzieś indziej w kodzie i użyć jej ponownie), możesz utworzyć funkcję, która tworzy wywołania zwrotne. To także pozwala na alias zmienne mają być dostępne pod różnymi nazwami (np x i m):

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

a następnie w doRequest() wykonaj xhttp.onreadystatechange = createCallback(xhttp, msg);

Jeśli wszystko, co chciałem zrobić, to „zmiana nazwy zwaną dalej” zmienne, możesz to zrobić liniowo i anonimowo:

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

Dzięki. Ta odpowiedź skłoniła mnie do nauczenia się dużo więcej o JavaScript. Naprawdę wszystko, co musiałem wiedzieć, to jak działają zamknięcia. –

+0

http.onreadystatechange = function() { var xmlHttp = this; if (xmlHttp.status == 200) { console.log ("Mamy to!"); } }; – Abbas

12

Część powyższej odpowiedzi nie działa dla mnie. Po pierwsze, na osobnej funkcji zwrotnej nie mając parametry:

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

Załóżmy teraz, że funkcja zwrotna jest modyfikowany, aby otrzymać pewne parametry:

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

jednak gdzie indziej tutaj na StackOverflow ktoś wyjaśnił, że miał do czynienia z potrzebą przypisania "referencji funkcji" zamiast "wywołania funkcji" do onreadystatechange (podobnie jak NAZWA powyżej jest odniesieniem do funkcji) i wysłano rozwiązanie:

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

Przyszedłem tutaj, aby dodać coś do tej drugiej odpowiedzi, ale teraz nie mogę jej znaleźć. Więc równie dobrze mogę to tutaj dodać. W moim własnym kodzie użyłem zarówno zmiennych lokalnych, jak i zmiennych globalnych, i odkryłem coś, co nie działało poprawnie, ale teraz, gdy już wiem, co się właściwie stało, Słowo Ostrzeżenia wydaje się odpowiednie. Załóżmy, „g” to zmienna globalna:

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

Odniesienie funkcja jest przypisany do onReadyStateChange w pewnym momencie (T0) i funkcja wywoływana jest funkcja o nazwie w innym czasie (T1). Cóż, wartość zmiennej globalnej "g" w T1 jest wartością, która jest przekazywana do funkcji callBack, a NIE wartością "g", gdy odniesienie do funkcji zostało przypisane w T0. Nie pozwól, żeby to cię ugryzło, jakby mnie ugryzło! (Zazwyczaj zmienne lokalne nie mają tego problemu, ponieważ zazwyczaj są poza zakresem w T1, więc JavaScript musi używać ich istniejących wartości w T0, podczas ustawiania wartości parametrów anonimowej funkcji.)

Powiązane problemy