【问题标题】:How to kill a javascript function?如何杀死一个javascript函数?
【发布时间】:2013-06-05 18:34:43
【问题描述】:

示例代码:

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);

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

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

【问题讨论】:

  • 视情况而定。正在发生什么异步事情?如果是 XHR 请求,您可以.abort() 它。需要明确的是,myFunction 将在异步工作完成之前很久就退出。您要取消的是由myFunction 启动的任何未决异步操作,而不是myFunction 本身。
  • 我不知道你去了哪里,但是这里没有足够的信息来准确回答你的问题,

标签: javascript asynchronous kill


【解决方案1】:

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

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

    但请记住,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
    

【讨论】:

  • 如果您的第一个示例代表同步代码,它将不起作用,因为只要while 正在运行,该函数就会阻塞,因此没有其他代码能够设置abortWork变量。
  • @CrazyTrain 好点,但不是 100% 适用。首先,发挥你的想象力。为了清楚起见,它显示为一个循环,但它是随机的代码位,可以包含任何内容。不过,我将补充一点以确保您的观点得到反映。
  • 我很想知道允许哪个事件调用其处理程序,而不管阻塞代码如何。我以前从未听说过。
  • 找到了。一个示例是在警报显示期间发生的浏览器外部事件导致浏览器窗口调整大小,并导致调整大小处理程序运行。 stackoverflow.com/questions/2734025/…
  • 嘿,浏览器怪癖很有趣!
猜你喜欢
  • 1970-01-01
  • 2013-02-05
  • 1970-01-01
  • 2018-04-07
  • 2019-08-24
  • 2012-08-15
  • 1970-01-01
  • 2014-09-26
  • 1970-01-01
相关资源
最近更新 更多