Javascript: действие триггера при выходе из функции
Есть ли способ прослушивания функции JavaScript для выхода? Триггер, который может быть установлен после завершения функции?
Я пытаюсь использовать метод обфускации пользовательского интерфейса (BlockUI), когда объект AJAX извлекает данные из БД, но функция не обязательно выполняется последней, даже если вы поставили ее в конце вызова функции.
Пример:
function doStuff() {
blockUI();
ajaxCall();
unblockUI();
};
Есть ли способ для doStuff прослушивать завершение ajaxCall перед запуском unBlockUI? Как таковой, он обрабатывает функцию линейно, вызывая каждый объект по порядку, затем создается отдельный поток для завершения каждого. Таким образом, хотя мой вызов AJAX может занять 10-15 секунд, я блокирую пользователя только на долю секунды из-за линейного выполнения функции.
Есть менее изящные способы обойти это... положить конец цикла только тогда, когда возвращаемое значение, установленное функцией AJAX, установлено в true или что-то в этом роде. Но это кажется излишне сложным и неэффективным.
6 ответов
Как бы вы ни выполняли свои подпрограммы Ajax, вам нужна функция "обратного вызова", которая будет запущена после ее завершения:
function ajaxCall(callback){
//do ajax stuff...
callback();
}
Затем:
function doStuff(){
blockUI();
ajaxCall(unblockUI);
}
Ваш AJAX-вызов должен указывать функцию обратного вызова. Вы можете вызвать unblockUI из системы обратного вызова.
SAJAX - это простая библиотека AJAX, в которой больше информации о том, как выполнять вызовы AJAX.
Есть также еще один пост, который описывает то, что вы ищете.
Вам необходимо перестроить поток вашей программы, чтобы он был совместим с потоком асинхронности, как, например, указание функции обратного вызова, вызываемой после обработки ответа. Посмотрите, как Prototype, JQuery или... выполняет это.
Вы можете сделать синхронный xhr. Это вызовет весь блок пользовательского интерфейса на время вызова (независимо от того, сколько времени это может занять).
Мне кажется, что вы хотите, чтобы пользователь ждал, пока информация извлекается из БД. Когда я выполняю Ajax-вызов для получения некоторой информации из базы данных, я делаю, чтобы отображать анимированный GIF-файл с надписью "получать его..." - он постоянно мигает, пока информация не будет извлечена и отображена на веб-странице. Когда информация отображается, анимированный GIF отключается / скрывается, и фокус перемещается на новую отображаемую информацию. Анимированный GIF позволяет пользователю знать, что что-то происходит.
Ответ прост: вы должны вызывать unblockUI(), когда ваш ajax-запрос возвращает результат, используя jQuery, вы можете сделать это следующим образом:
function doStuff(){
blockUI();
jQuery.ajax({
url: "example.com",
type: "POST", //you can use GET or POST
success: function(){
unblockUI();
}
});
}