0

我的网页上有两个按钮“a”和“b”,其“onclick”事件与两个javascript函数“x”和“y”绑定。

当用户点击按钮“a”时,“x”的执行开始并假设在函数“x”的执行期间,用户按下按钮“b”。
现在我想实现这样的逻辑,即当按下“b”按钮时,“x”的执行应该立即停止,“y”的执行应该开始。

可以在javascript中做到这一点吗?如果是,那怎么办?

谢谢

4

3 回答 3

0

一般来说,javascript是单线程的,它在执行时会阻塞用户界面。因此,当您按下按钮 a 并启动功能 x 时,您的导航器将不允许您按下按钮 b,直到 x 完成。

于 2013-10-08T16:42:27.140 回答
0

恐怕你不能在函数启动后停止它,除非它是异步的(并且你可以像 AJAX 请求一样控制它)。

你可以在一个循环中做事,并且有一个值是一些取消条件。

于 2013-10-08T16:39:37.930 回答
0

您的问题有两个棘手的方面:

  1. 当用户点击按钮 A
  2. X 的执行应立即停止

第一部分很棘手,因为虽然用户可以随时单击按钮,但网页不会意识到它,直到执行上下文开始处理该特定事件。由于 JS 是单线程的,如果你在函数 X 的中间,在函数 X 完成之前你不会得到任何点击事件。

可以通过将函数拆分为小块并延迟其执行以允许执行上下文处理工作时发生的事件来规避此问题。

function doSomeWork(nextFunction) {
   // do work
   setTimeout(nextFunction, 0); // allow event handling, then continue with nextFunction
}

这种异步编程有很多话要说,这里不再赘述。

第二个问题虽然乍一看更简单,但也有其自身的问题。例如在以下代码中:

   function Y() {
      X();
      Z();
   }

   function X()  {
     // stop execution please!
   }

当您停止执行X(最有可能使用return)时,它只会退回到Y,它将继续执行并调用Z。从您的问题来看,您似乎希望它停止一切并开始一个全新的“线程”。

一个可能的解决方案是从 X 中抛出一个未在 Y 中捕获的错误。这也会从 Y 中退出,但我不禁认为它是一个丑陋的 hack 并且无法支持它。

也许有了有关您确切问题的更多详细信息,我们可以提出更简单/更好的答案。

于 2013-10-08T16:59:33.047 回答