5

示例代码:

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

4

1 回答 1

5

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

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

    但请记住,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 请求。(注意:纯 javascript ajax 调用也会返回一个 XHR 对象。)请注意,请求已经发送到服务器,这只是告诉它忽略对请求的任何未来响应。

    var xhr = $.ajax({ type: "POST", ... });
    ... whatever ...
    xhr.abort(); //kill the request
    
于 2013-06-05T18:49:49.220 回答