Подождите, пока функция завершится, прежде чем начать снова - PullRequest
4 голосов
/ 23 декабря 2010

Доброе утро,

Я пытаюсь вызывать одну и ту же функцию каждый раз, когда пользователь нажимает кнопку. Вот что происходит в данный момент ..

Пользователь нажимает кнопку -> Функция вызовов -> Для завершения функции требуется 1000 мс + (из-за анимации с вызовами jQuery и AJAX)

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

Возможно ли это?

Извините, если мое объяснение немного сбивает с толку ..

Спасибо, Мэтью

Ответы [ 5 ]

6 голосов
/ 23 декабря 2010

Поскольку функции являются объектами, они могут хранить свойства.Вы можете заставить свою функцию увеличивать свойство 'queue' на себя каждый раз, когда она вызывается (нажата кнопка), а затем в конце выполнения функции проверять, является ли свойство очереди самой себя> 0, и если это так, уменьшать свойство queueпо одному и вызовите себя снова, используя setTimeout.

0 голосов
/ 23 декабря 2010

Отключить кнопку, когда они нажимают на нее.Включите его, когда подпрограмма ajax будет завершена.

0 голосов
/ 23 декабря 2010

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

Вот пример из документации jquery:

$('#clickme').click(function() {
  $('#book').animate({
    opacity: 0.25,
    left: '+=50',
    height: 'toggle'
  }, 5000, function() {
    // Put your code here, so it will be executed once the animation completes
  });
});

PS: Утро?Уже почти полночь; D

0 голосов
/ 23 декабря 2010

Вы можете отслеживать глобальную очередь / массив, где вы добавляете в очередь каждый раз, когда пользователь нажимает кнопку, тогда вам понадобится обратный вызов в вашей функции (например, в обратном вызове success для jQuery), которыйвыполняет работу по проверке очереди и вызову следующей функции в очереди.

0 голосов
/ 23 декабря 2010

Мне недавно пришлось сделать это в моем собственном приложении. Лучшее предложение, которое у меня есть для вас (если у вас уже есть вызовы AJAX внутри функции JavaScript), передать параметр функции обратного вызова в вашу функцию JavaScript. Затем в разделе success вашего вызова AJAX вызовите функцию обратного вызова.

Пример:

// In HTML <script> tags.
$(document).ready(function () {
    $("button#queue").click(function() {
        GetMembers(GetGroups(), MemberCallback));
    });
});

function GetMembers(userId, callback) {
    $.ajax({
        //Initialized AJAX properties
        url: "/My/Project/Ajax/Page.extension",
        data: "{ 'groupId':'" + groupId + "'}",
        success: function (result) {
            callback(result.d);
        }
    });
}

function MemberCallback(members) {
    // Do your thing here.
}
...