-1

В этом примере кодирования функция logout() не будет выполнять все ее асинхронные вызовы и не будет ждать, пока они не будут завершены, - вместо этого страница выгружается раньше, потому что возврат beforeunload Событие вызывает разгрузку страницы.Delay Return to Wait for Asynchronous Functions (событие beforeunload)

$(window).on('beforeunload', function(event) { 
    event.preventDefault(); 
    logout(); 
    return; 
}); 

То, что я хочу попробовать, что функция возвращает событие после нескольких асинхронных вызовов в logout() закончены.

EDIT: Моя цель NOT чтобы показать предупреждение! Я хочу только выполнить код до того, как страница будет выгружена. Функция выхода может содержать ajax-запросы и анимации jQuery с некоторой продолжительностью, которая должна быть завершена.

Я пробовал с обратными вызовами, но в конечном итоге, это не желаемый результат, поскольку он возвращается к обратному вызову, а не к функции события.

$(window).on('beforeunload', function(event) { 
    event.preventDefault(); 
    logout(function(x) { return; }); 
}); 
+0

Возможный дубликат [jquery beforeunload при закрытии страницы (не выходя)?] (Http://stackoverflow.com/questions/18783535/jquery-beforeunload-when-closing-not-leaving-the-page) –

+0

@ E.Mourits Нет, вы прочитали мой вопрос? Это не имеет никакого отношения к различию между уходом и навигацией, но для выполнения кода до того, как страница будет выгружена/загружена новая страница. – ScientiaEtVeritas

+0

Насколько я знаю, вы не можете запретить пользователю покидать страницу. Возможный дубликат - это ответ, который, как я думал, ближе всего к вашему желанию. –

ответ

-2

Не совсем чистое решение, но вы можете попробовать setTimeout, чтобы заставить код ждать во время выхода из системы.

var timeToLogoutInMs = 500; 
setTimeout(function() { 
    // Nothing 
}, timeToLogoutInMs); 

EDIT: Зачем вам нужно делать это на крюке beforeunload? Почему бы не отключить пользователя вручную?

+0

Насколько я знаю, setTimeout выполняется асинхронно, что означает, что он немедленно продолжит следующий оператор (возврат). Выход из системы - это просто пример - на самом деле речь идет о расширении Google Chrome. Я добавляю код на страницу и хочу показать что-то до того, как страница будет выгружена. – ScientiaEtVeritas

+0

Это не повлияет на поведение. –

+0

Хм, я вижу. Что произойдет, если вы вызываете предупреждение в том же самом крюке? Появится ли предупреждение о приостановке выгрузки? – tetutato

1

Поскольку все выполненные на странице страницы становятся недействительными, когда страница выгружается, вы не можете зависеть от самой страницы, чтобы завершить асинхронный вызов.

Одно слово для chrome extension будет использовать справочную страницу. Вы можете просто отправить сообщение на фоновый рисунок внутри обработчика beforeunload, поймать всю информацию, с которой вам нужно иметь дело, и выполнить асинхронный вызов на фоновом изображении. Пример кода будет:

content.js

window.addEventListener('beforeunload', function() { 
    chrome.runtime.sendMessage({ info: "Here is the info you would like to pass to background page"}); 
}); 

background.js

chrome.runtime.onMessage.addListener(function(request) { 
    // The following is your async call 
    logout(); 
    // Don't forget the following code 
    return true; 
}); 

Не забудьте вернуть истинное от слушателя событий в фоновом режиме страницы, так как chrome.runtime.onMessage.addListener станет недействительным, когда прослушиватель событий возвращается, см. this answer для получения более подробной информации.

+0

Это хорошая идея для бэкэнд-задач. Но могу ли я показать что-то из фонового скрипта, может быть, с chrome.tabs.executeScript - но я думаю, что он будет обновлен и не останется так долго, как я хочу, чтобы он остался? – ScientiaEtVeritas