случайные дубликаты запросов ajax - PullRequest
0 голосов
/ 19 июля 2010

Я заметил, что иногда (случайным образом) мой ajax-запрос Mootools отправляется дважды. Второй запрос выполняется сразу же, но первый просто ждет бесконечно долго. Я не уверен, что это ошибка в Mootools или что-то, что я сделал.

Это было проверено с помощью firebug в Firefox и консоли разработчика в Chrome. Я не мог проверить это в IE, но симптомы те же.

Мне действительно удалось сделать скриншот Firebug, показывая проблему: http://janipeltoniemi.net/ajax.png

Справа вы видите скрипт цикла запроса, который я написал для целей тестирования. Он просто делает запрос с новым идентификатором после того, как предыдущий запрос был выполнен, так что ничего особенного там нет. Последние 2 строки в консоли демонстрируют проблему, с которой я столкнулся. Как видите, они оба имеют одинаковый ответ и одинаковый идентификатор. Хеш md5 генерируется с использованием md5(microtime(1)), поэтому он должен отличаться, если эти 2 на самом деле были разными запросами с одинаковым идентификатором.

Цикл останавливается в этой точке, потому что он не запускает событие onSuccess после завершения последнего. Я предполагаю, что это вызовет его, когда другой запрос будет выполнен, но это еще не произошло.

Есть идеи, что здесь происходит?

Почти забыл, я использую Mootools 1.2.4

код на картинке:

r = new Request.HTML();
counter = 0;
//increments the counter and requests hello.php
go = function() {
  counter += 1;
  //The loop was too fast and producted some side effects when delay was not used
  r.get.delay( 10, r, [ 'templates/hello.php', { counter: counter } ] )
}
//Create an endless loop. When the request from go() is finished, call go()
r.addEvent( 'success', go );
//Start the endless loop
go();

1 Ответ

0 голосов
/ 20 июля 2010

это похоже на перезапуск старого экземпляра класса Request до того, как он будет «готов», поэтому старый запрос запускает onSuccess без сервера, закрывающего соединение, где клиент теряет интерес, и перезапускает его, оставляя firebug всостояние ожидания.

http://www.jsfiddle.net/dimitar/NF2jz/201/

var r = new Request.HTML({
    url: '/ajax_html_echo/',
    data: {'html': "hello"},
    method: 'post',
    update: 'target_div',
    onSuccess: function(response) {
        (function() {
            go(); // you can reproduce the bug by removing the delay wrap
        }).delay(1000);
    }
});

var counter = 0;

var go = function() {
    counter++;
    // despite of trying r.cancel(), it does not cancel, 
    // you can set onCancel to test this;
    r.cancel().setOptions({
        data: {html: "attempt " + counter}
    }).send();

};

go();

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

то, что я хотел бы сделать, выглядит примерно так (но, вероятно, рефакторинг, чтобы его можно было отменить):

var counter = 0;
(function go() {
    counter++;
    // fresh instance after success / complete:
    new Request.HTML({
        url: '/ajax_html_echo/',
        data: {'html': "hello " + counter},
        method: 'post',
        update: 'target_div',
        onSuccess: function(response) {
            go();
        }
    }).send();
})();

http://www.jsfiddle.net/dimitar/NF2jz/202/ демонстрация последнего кода, работает нормально и в некотором родеэто завершает и не мешает друг другу.

...