Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何控制javascript函数的执行?_Javascript_Javascript Events - Fatal编程技术网

如何控制javascript函数的执行?

如何控制javascript函数的执行?,javascript,javascript-events,Javascript,Javascript Events,我的网页上有两个按钮“a”和“b”,它们的“onclick”事件与两个javascript函数“x”和“y”绑定 当用户点击按钮“a”时,“x”开始执行,比如说在功能“x”执行期间,用户按下按钮“b”。 现在我想实现一个逻辑,当按下“b”按钮时,“x”的执行应该立即停止,“y”的执行应该开始 可以用javascript实现吗?如果是,那怎么办 谢谢我担心,除非函数是异步的(并且可以像AJAX请求一样控制它),否则一旦它启动,您就无法停止它 您可以在循环中执行操作,并在某些取消条件下设置一个值。一

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

当用户点击按钮“a”时,“x”开始执行,比如说在功能“x”执行期间,用户按下按钮“b”。
现在我想实现一个逻辑,当按下“b”按钮时,“x”的执行应该立即停止,“y”的执行应该开始

可以用javascript实现吗?如果是,那怎么办


谢谢

我担心,除非函数是异步的(并且可以像AJAX请求一样控制它),否则一旦它启动,您就无法停止它


您可以在循环中执行操作,并在某些取消条件下设置一个值。

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

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

  • 当用户单击按钮A时
  • 应立即停止执行X
  • 第一部分很棘手,因为尽管用户可以随时单击按钮,但在执行上下文开始处理特定事件之前,web页面不会意识到它。由于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,Y将继续执行并调用Z。从您的问题来看,似乎您希望它停止一切并启动一个全新的“线程”

    一个可能的解决办法是从X中抛出一个错误,这个错误在Y.没有被捕获,它也会退出Y,但是我不能不认为它是一个丑陋的黑客并且不能支持它。


    也许有了更多关于你的具体问题的细节,我们可以想出更简单/更好的答案。

    太理论化了,请提供一些代码,然后我们可以帮助-换句话说:不知道x和y在做什么以及如何杀死它们,就不可能回答。不,这不是直接可能的,因为在javascript执行完成之前,不会处理按钮单击。解决方案可能是使用webworkers,或者使用setTimeout将您的函数切割成小函数。