2009-03-25 3 views
9

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

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

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

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

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

+0

@thirsty: Вам нужна очередь и dequeue, я думаю (уже предложено и отклонено вами ниже). Вы можете упорядочить произвольные методы вместе с анимацией, и они будут выполняться по порядку. Если это не то, о чем вы спрашиваете, можете ли вы уточнить свой вопрос на примере того, что вы пытаетесь сделать? – Prestaul

+0

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

+0

Но на самом деле то, что я хочу, является оболочкой, которая останавливает весь javascript до тех пор, пока функция/анимация, которые я прошел в нее, не решила – thirsty93

ответ

10

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

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

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

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

+0

Что это за другие языки? Любопытно ... –

+0

Ну, почти все современные (не-браузерные) языки дают вам темы, используя поддержку ОС. Продолжения/сопрограммы можно найти по крайней мере в Haskell, ML и Scheme и некоторые расширения для других языков (например, Stackless Python); в C есть примитивы, которые можно использовать для построения продолжений. – bobince

+0

Конечно, в мире браузера вы застряли: кроме JavaScript есть только VBScript, и это еще хуже! JavaScript 1.7 (в Firefox 2) дает вам генераторы в стиле Python, которые являются ограниченной формой продолжения, которая вам действительно не поможет. – bobince

3

Вы, вероятно, ищет 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

. Это не задерживает выполнение до завершения функции. Что это значит, это выполнение задержки в очереди на определенный промежуток времени, который я устанавливаю. Я не знаю, сколько времени требуется для выполнения любой заданной функции, и мне не нужно было догадываться. – thirsty93

+0

Это лучше, чем ничего. Но это действительно не то, что я ищу. – thirsty93

0

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

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

+0

Это именно то, чего я не хочу. Обратный вызов, который я передаю рассматриваемой функции/анимации – thirsty93

0

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

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

function cancelButtonPress(){ 
    cancelJob = true; 
} 
Смежные вопросы