9

基本上,我希望能够将任何命令包装在 $.holdTillFinished() 方法中,该方法在指定的方法/jquery 动画执行完成之前不允许继续执行。

我怀疑这在javascript中可能很困难甚至不可能,但我希望有人会知道。

我不想听到我如何将回调传递给动画以使其在完成时运行,或者其他类似的东西。

我真的很想知道这样的事情是否可能以及如何去做。

如果有人知道一个很好的队列插件能够对用户定义的方法和动画进行排队,那么这不会发生,那也很酷。我真正想要的是一种延迟执行的方法。(同时仍然允许动画运行)

4

4 回答 4

10

我怀疑这在javascript中可能很困难甚至不可能

你的怀疑是正确的。动画、用户输入循环和 'async=true' XMLHttpRequests 等方法必须将控制权返回给浏览器才能继续进行,并且浏览器在每个嵌套级别的函数调用都返回之前无法收回控制权。这意味着您的所有代码,包括调用 'holdTillFinished()' 的函数都必须展开:因此 'holdTillFinished()' 是不可能的。

其他语言具有流控制功能,允许您有效地执行异步过程,因为在调用者看来是同步的,反之亦然。最著名的是线程延续。JavaScript 不具备这些功能,因此您能做的最好的事情就是超时和回调。

(将回调定义为内联函数以访问闭包中的封闭函数的变量至少可以减轻一些痛苦;一些其他语言必须开始将每一位封闭状态包装在对象的属性中以实现这一点.)

于 2009-03-25T04:51:09.753 回答
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);
  });
};
于 2009-03-25T02:46:08.493 回答
0

您可以使用发布/订阅架构来实现您想要的。在不知道你到底想要达到什么的情况下,我猜这对你有用。

它的工作方式是您将函数的完成视为一个事件,您可以收听并将处理程序附加到该事件。Dojo 有一个 pubsub 机制,尽管我确信还有其他机制。

于 2009-03-25T08:07:26.863 回答
0

它根据情况进行防御,但通常需要在调用 AJAX 或在 javascript 中执行任何循环时显示处理图像。我有一种情况,我在循环中调用 AJAX,以便用户显示处理图像。为了终止我做了一个技巧。我已经放置了一个按钮来在调用此函数时取消作业我将一个全局变量说'cancelJob'设置为true,并且在我正在检查这个全局的循环中,如果这是真的,则运行返回false并且脚本将停止。

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

function cancelButtonPress(){
   cancelJob = true;
}
于 2011-11-04T10:31:58.547 回答