У меня странная проблема с запросом 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
});
}