Передавать аргументы в обратный вызов ajax onreadystatechange?
Что такое обычный чистый javascript (т.е. не JQuery) способ передать аргументы в анонимный обратный вызов onreadystatechange?
Например:
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.... */
}
Ответы
Ответ 1
Javascript поддерживает закрытие, поэтому анонимная функция, которую вы написали, сможет получить доступ к xhttp
и msg
из охватывающей области doRequest()
.
Если вы хотите сделать это явно (скажем, если вы хотите определить функцию обратного вызова где-то еще в коде и повторно использовать ее), вы можете создать функцию, которая создает обратные вызовы. Это также позволяет вам использовать псевдонимы для переменных с разными именами (например, x
и m
):
function createCallback(x, m) {
return function() {
/* Do whatever */
};
}
а затем в doRequest()
, do xhttp.onreadystatechange = createCallback(xhttp, msg);
Если бы все, что вы хотели сделать, это переименование переменных, вы можете сделать это inline и анонимно:
xhttp.onreadystatechange = (function(x, m) {
return function() {
/* Do stuff */
}
})(xhttp, msg);
Ответ 2
Часть вышеупомянутого ответа не работала для меня. Во-первых, для отдельной функции callBack без параметров:
xhttp.onreadystatechange = callBack; //works; the function 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, кто-то объяснил, что это связано с необходимостью назначать "ссылку на функцию" вместо "вызова функции" на onreadystatechange (например, NAME выше является ссылкой на функцию) и отправляет решение
xhttp.onreadystatechange = function(){callBack(x,m);}; //works
Я пришел сюда, чтобы добавить что-то к этому другому ответу, но теперь его не найти. Поэтому я мог бы добавить его здесь. В моем собственном коде я использовал как локальные переменные, так и глобальные переменные, и обнаружил то, что, похоже, не работает правильно, но теперь, когда я знаю, что на самом деле произошло, Word Of Warning кажется подходящим. Предположим, что "g" - глобальная переменная:
xhttp.onreadystatechange = function(){callBack(x,g);};//anonymous function works
Ссылка на функцию назначается для onreadystatechange в некоторый момент времени (T0), а функция callBack вызывается в другое время (T1). Ну, значение глобальной переменной "g" в T1 - это значение, которое передается функции callBack, а не значение "g" , когда назначение функции было назначено на T0. Не позволяй этому укусить тебя, как будто это укусило меня! (Локальные переменные обычно не имеют этой проблемы, потому что они обычно не входят в область видимости в T1, поэтому JavaScript должен использовать свои существующие значения в T0 при настройке параметров-значений анонимной функции.)