Вопрос

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

Я подозреваю, что это может быть сложно или даже невозможно в javascript, но я надеюсь, что кто-нибудь узнает.

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

Я действительно хочу знать, возможно ли такое и как это осуществить.

Если этого не произойдет, если кто-нибудь знает о хорошем плагине queue, который способен ставить в очередь как пользовательские методы, так и анимации, это тоже было бы здорово.Что я действительно хочу, так это способ отложить выполнение.(при этом все еще позволяя анимации функционировать)

Это было полезно?

Решение

Я подозреваю, что это может быть сложно или даже невозможно в javascript

Ваше подозрение верно.Такие методы, как анимация, циклы пользовательского ввода и запросы ‘async=true’ XMLHttpRequests должен верните управление браузеру, чтобы продолжить, и браузер не сможет вернуть управление до тех пор, пока не будет возвращен каждый уровень вложенности вызова функции.Это означает, что весь ваш код, включая функцию, которая вызвала ‘holdTillFinished()’, должен был бы размотаться:следовательно, ‘holdTillFinished()’ невозможно.

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

(Определение обратного вызова как встроенной функции для получения доступа к переменным заключающей функции в замыкании, по крайней мере, частично устраняет эту проблему;некоторые другие языки должны начать обертывать каждый бит заключающего состояния в свойствах объекта, чтобы достичь этого.)

Другие советы

Вы, вероятно, ищете http://docs.jquery.com/Effects/queue

Но если вы ищете более обобщенный способ отсрочки, я уже использовал этот фрагмент раньше (я его не писал, так что вся заслуга принадлежит оригинальному автору).:

//Simple wrapper enabling setTimout within chained functions.
$.fn.wait = function(time, type) {
  time = time || 1000;
  type = type || "fx";
  return this.queue(type, function() {
    var self = this;
    setTimeout(function() {
      $(self).dequeue();
    }, time);
  });
};

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

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

Это зависит от ситуации, но обычно необходимо показать изображение обработки, которое будет отображаться при вызове AJAX или выполнении любого цикла в javascript.У меня есть ситуация, когда я вызываю AJAX в цикле, чтобы пользователь мог показать обрабатываемое изображение.Чтобы покончить с этим, я проделал трюк.Я поместил кнопку для отмены задания, когда вызывается эта функция, я устанавливаю глобальной переменной say 'cancelJob' значение true, и в цикле, где я проверяю это глобальное значение, если это верно, запуск возвращает false, и скрипт останавливается.

var cancelJob = false;
foreach(){
   if(cancelJob == true)
       return false;
}

function cancelButtonPress(){
   cancelJob = true;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top