2013-05-28 2 views
0

Я использую следующий код для отправки действия и параметр скрипта на моем сервере:Ajax сообщение задерживается предупреждение

$(function() { 
    url = "http://...../myscript.php"; 
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false}); 
    alert("Hello"); 
}); 

Я заметил (на Safari 6.0.4 на MacOSX) предупреждение появляется окно и запрос ajax отправляется только после Я нажимаю «OK». (В Chrome запрос отправляется во время отображения предупреждения).

Таким образом, код после мой запрос ajax фактически задерживает отправку запроса.

Почему это?

Edit:

$.post(url, { action: 'system', param: 'volume get 5'}, {cache: false}); 
sum = 0; 
for(i = 0; i < 1000000000; i++) 
    sum++; 
$("title").html(sum); 

Вызывает запрос будет отправлен после того, как расчет делается.

+1

Поскольку alert() является блокирующим действием. Сообщение отправляется, предупреждение затем останавливает браузер от обработки результата (помните, ajax является асинхронным), пока вы не закроете предупреждение. Вы не задерживаете отправленный запрос, вы задерживаете полученный запрос. –

+0

@KevinB Чтобы уточнить, вы откладываете функции обратного вызова от выполнения, а не получаемый ответ. –

+0

@KevinB Я ожидаю, что браузер блокирует любые обратные вызовы или аналогичные, но что нет исходящего запроса кажется странным? – Samuel

ответ

2

Я заметил (в Safari 6.0.4 на MacOSX) окно предупреждения появляется, и запрос ajax отправляется только после нажатия «ОК». (В Chrome запрос отправляется во время отображения предупреждения).

Таким образом, код, следующий за моим запросом ajax, фактически задерживает отправленный запрос.

Я считаю, что очень удивительно, но я не могу проверить это, как я не Mac OS X. Хотя alert блокирует основной JavaScript нить, она не должна препятствовать браузер от отправки просьбе , так как браузер многопоточен. Но я предполагаю, что это возможно, в некоторых реализациях.

Обратите внимание, что независимо от того, alert будет поддерживать вызов любого обработчика «успеха» или «ошибки», связанного с запросом, что совсем другое. Это связано с тем, что, если вы не используете веб-работников, JavaScript однопоточен в браузерах, а (снова) alert поддерживает один поток JavaScript.

Если отправки действительно получать поддерживавшиеся alert, вы можете исправить это с setTimeout:

$(function() { 
    url = "http://...../myscript.php"; 
    $.post(url, { action: 'my action', param: 'my parameter'}, {cache: false}); 
    setTimeout(function() { alert("Hello"); }, 0); // Defers it 
}); 

Если это обратные вызовы, которые становятся все удерживаемые до, лучший способ борьбы с этим является чтобы сделать что-то более современное, чем alert, например, красиво оформленное абсолютно div, содержащее сообщение. Если вы хотите, чтобы сообщение было модальным, вы можете сделать это самостоятельно, хотя есть некоторые граничные условия, при отключении остальной части страницы; но есть также около миллиона «модальных» плагинов для jQuery, которые обрабатывают эти граничные условия для вас. (Оба JQuery UI и Bootstrap предоставляют их, и их много.)

+0

Я нахожу это очень удивительным, и на самом деле это отправка (сценарий записывает в базу данных и запись делается * после того, как * отозвано предупреждение). Установка таймаута фактически решает эту проблему. Возникает вопрос: возникает ли эта проблема только с предупреждениями или с любым кодом сразу после части ajax. Это было бы неприятно обходить. – Samuel

+0

@Samuel: Я ожидаю, что это просто «предупреждение» и «подтвердить», хотя, возможно, если вы отправили * синхронный * ajax-вызов, после того, как он может также удержать вещи. (Но синхронные вызовы ajax лучше всего избегать.) 'Alert' и' confirm' - это, в основном, единственные вещи, которые блокируют поток. Я имею в виду, что у вас может быть бесконечный цикл, но тогда Safari в любом случае убьет скрипт ... –

+0

Я добавил еще один случай к вопросу. Как и ожидалось (от неожиданного), запрос снова отправляется * после * суммирования. Поэтому, пока запрос всегда будет отправлен в какой-то момент (игнорируя пока (правда)), время не определено. – Samuel

Смежные вопросы