是否可以在 javascript/jquery 中停止执行?

Posted

技术标签:

【中文标题】是否可以在 javascript/jquery 中停止执行?【英文标题】:Is it possible to stop execution in javascript/jquery? 【发布时间】:2010-10-15 08:48:35 【问题描述】:

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

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

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

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

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

【问题讨论】:

@thirsty:我想你想要队列和出队(你已经在下面建议并驳回了)。您可以将任意方法与动画一起排队,它们将按顺序执行。如果这不是您要问的,那么您能否举例说明您正在尝试做的事情来澄清您的问题? 我还没有看到适用于函数的队列。我的意思是,如果我将一个动画、一个函数、一个动画传递到队列中,那么当这些动画正在播放时,该函数不应该被执行。另外我不想指定函数执行需要多长时间。 但我真正想要的是一个包装器,它可以停止所有 javascript,直到我传递给它的函数/动画已经解决 【参考方案1】:

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

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

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

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

【讨论】:

嗯,几乎所有现代(非浏览器)语言都使用操作系统支持为您提供线程。至少可以在 Haskell、ML 和 Scheme 以及对其他语言的一些扩展(例如 Stackless Python)中找到延续/协程; C 中有一些原语可用于构建延续。 当然,在浏览器的世界里,你会被卡住:除了 JavaScript,只有 VBScript,而且更糟! JavaScript 1.7(在 Firefox 2 中)为您提供了 Python 样式的生成器,这是一种有限的延续形式,在这里并不能真正帮助您。 射击,我的意思是“什么语言必须开始将每一位封闭状态包装在对象的属性中才能实现这一点?”。 没有一流函数和闭包的语言,例如 C[++] 和 Java。 (Java 的匿名内联类几乎可以做到这一点,因为它们可以读取但不能写入外部函数变量。)【参考方案2】:

您可能正在寻找http://docs.jquery.com/Effects/queue

但是如果你正在寻找一种更通用的延迟方式,我之前使用过这个 sn-p(我没有写它,所以所有功劳归原作者所有):

//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);
  );
;

【讨论】:

这不会延迟执行直到函数结束。这样做是将队列中的执行延迟我设置的某个时间限制。我不知道运行任何给定函数需要多长时间,我不应该猜测。 这总比没有好。但这真的不是我想要的。【参考方案3】:

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

它的工作方式是将函数的完成视为一个事件,您可以侦听该事件并将处理程序附加到该事件。 Dojo has a pubsub mechanism,虽然我敢肯定还有其他人。

【讨论】:

这正是我不想要的。我传递给相关函数/动画的回调【参考方案4】:

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

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


function cancelButtonPress()
   cancelJob = true;

【讨论】:

以上是关于是否可以在 javascript/jquery 中停止执行?的主要内容,如果未能解决你的问题,请参考以下文章

是否可以在 javascript/jquery 中创建一个空的多维数组?

是否可以使用 JavaScript/jQuery 解决这种情况? [复制]

是否有任何 JavaScript/jQuery 插件可以让我在播放歌曲达到特定播放时间时触发动作?

JavaScript/jQuery 等效于 LINQ Any()

javascript/jquery 输入验证

在 Javascript/JQuery 中选择单选选项时,是不是可以动态更改下拉列表的颜色或更改列表项的颜色?