Для тех, кто может наткнуться. У меня есть очень простое решение для этого.
Я работаю над проектом на основе сокетов, и та же проблема возникла у меня.
Вот мое решение:
function freezeScreen(ms){
var s=(new Date).getTime();
while(((new Date).getTime())-s<ms){}
};
Это заставит окно браузера зависнуть на указанное количество мс.
Сразу после отправки асинхронного запроса позвоните freezeScreen, скажем, с 50 мс. Пользователь, вероятно, не заметит этого, и это дает клиенту достаточно времени для отправки запроса, прежде чем клиент отключится.