AJAX (XMLHTTPRequest) время задержки - PullRequest
0 голосов
/ 25 октября 2010

Я новичок в AJAX и имею эту проблему.

Я создаю страницу фотогалереи и на ней я создал класс Javascript, который управляет всем этим.Вот метод из класса, который вызывает объект XMLHTTPRequest, который был успешно инициализирован ранее:

this.AJAX_update = function(id) {
    //initialize AJAX - this is done successfully
    this.AJAX_initialize();
    var url = "ScriptLibrary/gallery_update.php?img=" + id;
    //this.ajax_request is an internal variable which is
    //initialized in this.AJAX_initialize() and is
    //XMLHTTPRequest type
    this.ajax_request.open("GET", url, true);
    this.ajax_request.onreadystatechange = processAJAX;
    this.ajax_request.send(null);
}

Я не мог понять, как вызвать внутренний метод класса в onreadystatechange, поэтому я создал функцию вне классакоторый вызывает метод внутри класса при условии, что экземпляр класса был создан на той странице, на которой он находится.Экземпляр класса на странице является переменной 'gallery'.Вот функция:

function processAJAX() {
    gallery.AJAX_process();
}

Вот код функции AJAX_process ():

this.AJAX_process = function() {
    if (this.ajax_request.readyState == 4) {
        if (this.ajax_request.status == 200) {
            //get the response
            var response = this.ajax_request.responseXML;

            //Here I set the internal variables according to the value
            //returned from the server
            //...........
            //...........
            //...........

            //change image on the page
            var self = this;
            setTimeout(function() {
                self.swap_dissolve();
            }, 50);

        }
    }
}

Итак, вот мой вопрос:

Изначально я пыталсявызвать внутреннюю функцию напрямую, просто выполнив this.swap_dissolve (), однако она не работает.По сути, метод AJAX_process () изменяет значения внутренних переменных определенного класса в соответствии с ответом от сервера, и эти значения используются в swap_dissolve () для фактического изменения изображения на странице.Что произойдет, так это то, что swap_dissolve () не изменит изображение правильно, потому что оно видит нулевые или не обновленные значения переменных AJAX_process () обновленными.Когда я добавил задержку, проблема исчезла.Я не понимаю, почему это происходит.Я проверяю, что readyState == 4, поэтому ответ от сервера был полностью возвращен, поэтому любые значения, которые устанавливает функция, являются окончательными и могут использоваться сразу, так почему я не могу использовать эти значения сразу иподождать?

Буду весьма признателен за любые предложения или ошибки в моем коде для решения этой проблемы.

Если у вас есть вопросы ко мне, пожалуйста, оставьте ответ на этот вопрос.

Спасибо.

1 Ответ

1 голос
/ 25 октября 2010

Вы хотите использовать «замыкание» (например, передать объект-функцию в setTimeout).

Представьте себе это (черт возьми, подставьте его в код, чтобы увидеть):

// when response = 200
var someValue = "blahblah" // whatever you read in
setTimeout(function () {
  alert(someValue)
}, 1000)

Предупреждение должно отображать «блабла» (или все, что вы ему назначили).Это значение доступно для объекта анонимной функции, так как была создана привязка замыкания (функция может обращаться к переменным области видимости (ей) включающей функции.

Вот ссылка: http://jibbering.com/faq/notes/closures/и многое другое из мягкого вступления: http://blog.morrisjohns.com/javascript_closures_for_dummies.html

Счастливого кодирования.

Редактировать / PS Вы также можете написать обработчик AJAX как (это просто замыкание, чтобы заставитьисправьте контекст «this» - некоторые фреймворки предлагают для этого удобные функции):

var self = this
this.ajax_request.onreadystatechange = function () {
   self.process_AJAX()
}

Вы можете даже использовать двойное связывание, но ... опять же, удачное кодирование: -)

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