У меня есть JS-функция с сотнями линий. Мне нужно убедиться, что функция не вызывается снова, прежде чем она завершит выполнение предыдущего вызова.Функция повторного выполнения не до его завершения
Так что я попытался это:
var executing = false;
function myFunc(){
//stop executing if it's already executing
if(executing){
return false;
}
executing = true;
/* the main function with ajax-calls etc */
$.ajax({
type: "POST",
url: "/"+method+action,
data: "a=1",
success: function(data){
//the inner function logic...
executing = false;
}
}
это выглядит ложным для вас? Где мой недостаток? Может быть, ошибка в другом месте не зарегистрированного кода, если вы считаете, что это имеет смысл. Спасибо за ваш отзыв!
Предоставленный фрагмент «будет работать», как ожидается, * если * другой код не мешает ему. Однако в некоторых случаях: 1. Что-то еще меняет 'executing' (помните, что другие события могут быть запущены до завершения AJAX-вызова). Также 'executing' является бесполезным родовым именем в любой более широкой области; 2) Что происходит, когда вызов AJAX терпит неудачу ?; 3) Очередь? 4) * Исправить * ошибки синтаксиса (например, закрытие ')'). – user2246674
спасибо. Ничто иное не меняет «выполнение». Если ajax-вызов завершится с ошибкой, проблем не будет, потому что тогда элементы не будут добавлены (я использую это для загрузки большего количества элементов в бесконечной прокрутке). Queuing? Не могли бы вы объяснить это немного больше? –
Возможно, вы не захотите отказаться от следующего запроса - представьте, что пользователь автоматически выполняет что-то, они набирают X (запускают вызов AJAX), затем XY - вы хотите, чтобы он в конечном итоге отображал слова, уточненные для XY (ксилофон) не только X (ксенон). Простой способ справиться с этим тривиальным примером - отменить выдающиеся вызовы XHR - и, возможно, использовать объект XHR в качестве часового (вместо отдельного bool). – user2246674