如何杀死一个javascript函数?

Goj*_*e87 5 javascript asynchronous kill

示例代码:

var isExecutionOver = false,
    myFunction = function() {
      // does some asynchronous stuff and sets isExecutionOver to true
      // when the asynchronous job is over.
    };

myFunction();

// Kill myFunction if it takes more than 3 seconds
setTimeout(function() {
  if(!isExecutionOver) {
    // How do I kill myFunction?
  }
}, 3*1000);
Run Code Online (Sandbox Code Playgroud)

myFunction在上面的代码片段中,如果它无法在给定时间内(本例中为 3 秒)完成其工作,我将尝试终止(或者换句话说,停止执行) 。

PS:请假设我无法控制 myFunction 定义。我唯一可以工作的地方就是里面setTimeout

Lee*_*dor 5

你有一个非常复杂的问题:

  • 您实际上无法终止正在运行的函数。有时您可以设置一个标志,以便它在决定检查时可以注意到。它可以停止正在做的事情并返回。

    但请记住 JavaScript 是一种单线程语言。当此函数中的代码运行时,任何其他代码几乎没有办法设置该标志。

    示例 1:我似乎记得一些浏览器如何在弹出警报框时让某些事件从事件队列中运行。这些事件可能会树立标志。

    示例 2:另一种可能性是函数中的代码从技术上讲并不在函数中,但函数启动了一个完成工作的间隔计时器。任何其他代码都可以设置该标志,并且定期运行的代码可以检查该标志并停止重复。

    var abortWork = false;
    function a() {
        while (notDone) {
            .. do some work ...
            if (abortWork) {
                return;
            }
        }
    }
    ... whatever ...
    abortWork = true;
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以停止setTimeout()正在等待时间结束的事件。(有类似的方法可以停止setInterval()重复事件。

    var t = setTimeout(function() {
            ... code goes here ...
        }, 20000);
    ... whatever ...
    clearTimeout(t); // stop the timeout if it hasn't started running the function
    
    Run Code Online (Sandbox Code Playgroud)
  • 您可以停止正在等待响应的 ajax 请求。(注意:纯 javascript ajax 调用也会返回 XHR 对象。)请注意,请求已经发送到服务器,这只是告诉服务器忽略将来对该请求的任何响应。

    var xhr = $.ajax({ type: "POST", ... });
    ... whatever ...
    xhr.abort(); //kill the request
    
    Run Code Online (Sandbox Code Playgroud)

  • 呵呵,浏览器怪癖很有趣! (2认同)