Обработка множественных вызовов ajax - PullRequest
3 голосов
/ 07 февраля 2009

Я использую jQuery для выполнения некоторых вызовов ajax и удивляюсь, как люди справляются с этой ситуацией.

  1. На сервер делается ajax-запрос для получения некоторой информации.
  2. Перед возвратом запроса выполняется другой запрос. Первый запрос теперь недействителен и устарел.

Как мне сказать, что первоначальный запрос теперь недействителен и может быть проигнорирован при его возврате. Я только хочу отобразить результаты второго запроса и игнорировать (или отменить) первый.

Ответы [ 5 ]

13 голосов
/ 07 февраля 2009

jQuery возвращает объект XmlHttpRequest из вызова к ajax(), который я использовал для достижения того, что вы хотите, следующим образом:

var lastRequest;
function getSomeData() {
    if(lastRequest) {
        lastRequest.abort();
        lastRequest = null
    }
    lastRequest = $.ajax(...);
}

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

2 голосов
/ 07 февраля 2009

Вести запись переменной (например, "request_id"), которая идентифицирует запрос. Добавляйте 1 к переменной при каждом новом запросе. Обрабатывайте запрос только в том случае, если возвращаемый сервером request_id равен той переменной, которая у вас есть на клиенте.

0 голосов
/ 07 февраля 2009

Я предпочитаю не привлекать сервисный звонок, вы не всегда можете контролировать определение сервиса. Я хотел бы видеть что-то вроде этого

$(function() {
    $('.ajaxButton').click(function() {
        $.currentCallId = (new Date()).getTime();

        $.ajax({
            type: "get",
            url: 'http://www.google.com/',
            beforeSend: function(xhr) {
                this.callId = $.currentCallId;
            },
            success: function(data) {
                if (this.callId === $.currentCallId) {
                    // process it
                } else {
                    // throw it out
                }
            }
        });
    });
});
0 голосов
/ 07 февраля 2009

«Как мне узнать, что первоначальный запрос теперь недействителен»

Вы НЕ ...! Вы ставите Ajax Requests в очередь на клиентском уровне и не позволяете им срабатывать до тех пор, пока предыдущие не вернутся и не закончили свои манипуляции с DOM ...

Вы можете получить некоторые подробности о том, как это сделать, в моем блоге о том, "как создать библиотеку Ajax", по адресу; http://ra -ajax.org / how-to-create-an-ajax-library-part-7-the-ra-ajax-class.blog

0 голосов
/ 07 февраля 2009

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

var incrementor = 1;
var lastSent = 0;

jQuery(document).ready(function() {

    jQuery('a.submitter').click(function(event) {
        event.preventDefault();
        lastSent = incrementor;
        incrementor++;
        jQuery.post(
            'some-url.php',
            {
                'request-id': lastSent,
                'other-data': 'some-data'
            },
            function( data, textStatus ) {
                if( data.requestId == lastSent ) {
                    // Do stuff
                }
            },
            'json'
        );
    });

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