2013-05-30 4 views
0

У меня есть 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; 
     } 
} 

это выглядит ложным для вас? Где мой недостаток? Может быть, ошибка в другом месте не зарегистрированного кода, если вы считаете, что это имеет смысл. Спасибо за ваш отзыв!

+2

Предоставленный фрагмент «будет работать», как ожидается, * если * другой код не мешает ему. Однако в некоторых случаях: 1. Что-то еще меняет 'executing' (помните, что другие события могут быть запущены до завершения AJAX-вызова). Также 'executing' является бесполезным родовым именем в любой более широкой области; 2) Что происходит, когда вызов AJAX терпит неудачу ?; 3) Очередь? 4) * Исправить * ошибки синтаксиса (например, закрытие ')'). – user2246674

+0

спасибо. Ничто иное не меняет «выполнение». Если ajax-вызов завершится с ошибкой, проблем не будет, потому что тогда элементы не будут добавлены (я использую это для загрузки большего количества элементов в бесконечной прокрутке). Queuing? Не могли бы вы объяснить это немного больше? –

+1

Возможно, вы не захотите отказаться от следующего запроса - представьте, что пользователь автоматически выполняет что-то, они набирают X (запускают вызов AJAX), затем XY - вы хотите, чтобы он в конечном итоге отображал слова, уточненные для XY (ксилофон) не только X (ксенон). Простой способ справиться с этим тривиальным примером - отменить выдающиеся вызовы XHR - и, возможно, использовать объект XHR в качестве часового (вместо отдельного bool). – user2246674

ответ

0

Попробуйте добавить async вариант для JQuery ajax и установить его на ложь, чтобы сделать синхронные запросы:

$.ajax({ 
     type: "POST", 
     async :false, 
     url: "/"+method+action, 
     data: {a:1}, 
     success: function(data){ 
     //the inner function logic... 
     executing = false; 
     } 
Смежные вопросы