Проблема события onreadystatechange в вызове AJAX? - PullRequest
0 голосов
/ 11 ноября 2009

Проблема кажется очень странной. У меня есть вспомогательная функция AJAX в том же файле aspx, и событие onreadystatechange обрабатывается следующим образом

      xmlhttp.onreadystatechange = function(){
             if (xmlhttp.readyState == 4)
                   //do some opp
      }

это отлично работает. я могу прочитать значение xmlhttp внутри обратного вызова.

И я переместил вспомогательные методы AJAX в дополнение к файлу js . И я создал метод что-то вроде этого

   function AjaxHelper() {
       this.GetValue = function(sData, sMethod, assembly, json, aSyncfunction) {
          var xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");

         if (typeof(aSyncfunction) != "undefined" && aSyncfunction != null) {
            xmlhttp.onreadystatechange = aSyncfunction
         }

         //Ajax open and send code here

       }
   }

Теперь я создаю функцию обратного вызова в моем файле aspx и вызываю функцию AjaxHelper.GetValue ()

     var callback=function(){
        if (xmlhttp.readyState == 4)
                   //do some opp

     }

     AjaxHelper.GetValue("test","getTest()","UIhelper","",callback) 

И функция обратного вызова успешно вызывается каждый раз после изменения состояния, но я не могу ссылаться на переменную xmlhttp. его всегда не определено .

Я собираюсь выполнить его в контексте AJaxhelper, но это не так.

Может кто-нибудь напугать меня, как решить эту проблему

1 Ответ

2 голосов
/ 11 ноября 2009

Я собираюсь выполнить его в контексте AJaxhelper, но это не так.

Нет. JavaScript лексически ограничен. После завершения функции GetValue локальная переменная xmlhttp больше не доступна. Если в области действия функции нет замыканий, сохраняющих ссылку на xmlhttp, а в этом случае их нет, переменная xmlhttp исчезает навсегда.

Возможно, вы захотите сохранить замыкание xmlhttp в GetValue и передать его функции обратного вызова:

if (aSyncfunction) {
    xmlhttp.onreadystatechange= function() {
        aSyncfunction(xmlhttp);
    };
}

Или вы можете назначить объект переменной-члену, например this.xmlhttp, где он будет виден другим функциям внутри и снаружи объекта.

PS. Также будьте осторожны, JavaScript чувствителен к регистру:

var xml H ttp

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...