如何杀死javascript函数?

时间:2013-06-05 18:34:43

标签: 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);

在上面的代码片段中,我试图杀死(或换句话说,停止执行)myFunction如果它无法在给定时间内完成工作(在这种情况下为3秒)。

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

1 个答案:

答案 0 :(得分:3)

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

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

    但请记住,JavaScript是一种单线程语言。当此函数中的代码正在运行时,任何其他代码设置该标志的方法都很少。

    示例1:似乎我记得一些关于某些浏览器如何在弹出警报框时允许从事件队列中运行某些事件的事情。那些事件可以设置旗帜。

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

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

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

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