Цикл событий JavaScript во время выгрузки страницы

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

Моя проблема в том, что иногда сервер не получает последний пакет сообщений, который был поставлен в очередь на клиенте. Эта проблема определенно чаще встречается в мобильных браузерах, кажется, чаще встречается в Safari, чем в Chrome (не уверен), это происходит чаще, когда выгрузка является результатом отправки формы.

Я предполагаю, что в какой-то произвольный момент браузер останавливает выполнение JavaScript независимо от ожидающих событий в очереди и/или игнорируя исполняемый стек. Поскольку сообщения отправляются асинхронно, я предполагаю, что стек отправки либо никогда не вызывался, либо был остановлен до того, как был достигнут вызов AJAX.

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

Мои вопросы:

  1. Когда выполнение JavaScript останавливается браузерами во время выгрузки?

  2. Гарантированно ли исполняемый стек будет работать до завершения во время выгрузки?

  3. Если браузер действительно произвольно прерывает выполнение, есть ли способ его отложить?

  4. Существуют ли какие-либо другие средства для обеспечения выполнения всех событий в очереди до того, как страница будет выгружена?

  5. Есть ли способ запросить статус очереди событий?


person Dondey    schedule 22.03.2015    source источник
comment
В конце концов, никаких гарантий. Пользователь может вытащить вилку из стены.   -  person Pointy    schedule 22.03.2015


Ответы (1)


на ваши вопросы:

1) в любое время

2) no.

3) нет, совсем нет.

4) не в этот момент, должно быть сделано раньше и должно быть завершено до того, как произойдет разгрузка.

5) какая очередь событий?

person Axel Amthor    schedule 22.03.2015
comment
Я имею в виду очередь, в которой хранятся обратные вызовы, ожидающие выполнения. Спасибо, Аксель. - person Dondey; 23.03.2015
comment
Вы можете поймать событие onunload и спросить пользователя, хочет ли он покинуть страницу, и отменить это от имени пользователя. Но событие происходит не во всех возможных случаях, и если пользователь нажимает «да», сценарии все равно прерываются. - person Axel Amthor; 23.03.2015