jQuery повторно отправляет запрос AJAX? - PullRequest
1 голос
/ 07 февраля 2012

У меня странная проблема с запросом jQuery AJAX jQuery. Когда мы создаем отчеты на нашем сайте, это может занять некоторое время, поэтому у нас есть строка состояния, которую мы обновляем с опросом. Однако я вижу, что эти запросы, по-видимому, имеют тайм-аут и повторную отправку - очень странное поведение.

Вот рабочий процесс: -Пользователь вводит свой адрес электронной почты и нажимает кнопку «Получить отчет» -Кнопка запускает запрос AJAX (см. Ниже). -После выполнения запроса AJAX мы отправляем второй более простой запрос для опроса функции checkStatus. Эта функция возвращает строку JSON обратному вызову, который обновляет строку состояния на экране. - В свойстве «success» исходного AJAX-запроса мы установили флаг, чтобы остановить опрос, поэтому, когда отчет завершается, опрос останавливается (и последнее обновление статуса отражает его окончание).

Это работает отлично, за исключением одной маленькой проблемы. Я обнаружил, что когда у нас большие отчеты, кажется, что он отправляет второй запрос getReport, но пользователь ничего не делает. Я могу сказать это, потому что наш статус достигнет примерно 700 из 1000 строк, а затем перейдет обратно к 15 из 1000, затем к 710 из 1000, а затем к 25 из 1000, указывая на то, что два отчета генерируются одновременно, и обновляется флаг состояния. с разными статусами.

Все, что я могу понять, это то, что исходный запрос getReport AJAX по какой-то причине отправляется повторно. Есть ли тайм-аут или что-то, о чем я не знаю?

Вот код:

var update = false;

//// Function triggered by user when requesting report
function get_report () {
    if ( !$("#reportEmail").val() ) {
        alert ( "Please enter a valid email address to send the report to." );
        return;
    }

    var dataStr = "email="+$("#reportEmail").val();

    $("#report").html ( "<b>Your report is being generated and will be emailed to you momentarily.</b>" );
    $.ajax({               
        type: 'POST',
        data: dataStr,
        url: "/reports/roster/15",
        success: function() { update = false; }
      });

    $("#completed").css ( 'width',"0" );
    update = true;
    setTimeout ( "checkStatus('reg_roster', updateStatusBar);", 10 );
}

//// Call back from the checkStatus function
function updateStatusBar ( data ) {
    response = jQuery.parseJSON(data);
    if ( response ) {
        $("#statusBar").show();
        $("#completed").css ( 'width', response.completed+"%" );
        $("#msg").html ( response.message );
        if ( update == true )
            setTimeout ( "checkStatus('reg_roster', updateStatusBar);", 1000 );
    }
}

////Polling function to check status
function checkStatus(type, callback) {
$.ajax({  
        type: 'POST',
        async: false,
        data: "&type="+type,
        url: "/status/check/",
        success: callback               
      });
}
...