Можно ли остановить выполнение в javascript / jquery? - PullRequest
9 голосов
/ 25 марта 2009

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

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

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

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

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

Ответы [ 4 ]

10 голосов
/ 25 марта 2009

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

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

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

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

3 голосов
/ 25 марта 2009

Вы, наверное, ищете 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);
  });
};
0 голосов
/ 04 ноября 2011

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

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

function cancelButtonPress(){
   cancelJob = true;
}
0 голосов
/ 25 марта 2009

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

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

...