【问题标题】:Question about setTimeout that I need answer to我需要回答的关于 setTimeout 的问题
【发布时间】:2018-09-17 23:24:44
【问题描述】:

所以我们都知道 setTimeout 在执行某事之前会等待一定的时间。我的问题是,它是先等待上面的代码完成执行,然后再等待一秒钟再执行其他东西,还是只等待一秒钟,无论上面的代码是否完成执行,它都会执行其余的代码还是?

if (1 == 1) {
//huge chunk of code
} //end of if (1 == 1)

var theTime = 1000;
var timeout = setTimeout("location.reload(true);", theTime);
function resetTimeout() {
clearTimeout(timeout);
timeout = setTimeout("location.reload(true);", theTime);
} //end of function resetTimeout()

我的目标是让第一部分代码完成执行,然后在第一部分代码完成执行后立即刷新页面。有没有办法做到这一点?

【问题讨论】:

    标签: javascript location settimeout userscripts


    【解决方案1】:

    在您的情况下,页面将在调用 setTimeout 后 1 秒重新加载。所以这是“巨大的代码块”时间加上 1 秒。

    要在第一部分代码完成后立即刷新页面,只需调用 location.reload 而不使用 setTimeout

    if (1) {
      //huge chunk of code
    }
    
    location.reload(true);
    

    编辑:这种方法不等待异步代码完成。比如下面的程序在弹出警告框之前就被reload打断了。

    if (1) {
      setTimeout(() => alert('Test'), 1000);
    }
    
    location.reload(true);
    

    【讨论】:

      【解决方案2】:

      如果您将 Timeout 设置为一个非常小的值(例如 1 毫秒,甚至可能为零,但尚未检查),它将在您的主代码完成后立即执行。它不会在你的主代码完成之前执行,因为 JavaScript 不是多线程的。

      【讨论】:

      • 所以如果你把它设置为1秒,它会等到你的代码执行完毕,然后再等一秒再执行别的东西?
      • 如果你把它放在你繁重的代码之后,那么是的。如果你把它放在繁重的代码之前,那么我不确定它是否会再等一秒钟。它肯定会发生在你的大量代码之后,从来没有。这是一个很好的问题,我似乎找不到任何文档来说明计时器何时开始。
      【解决方案3】:

      JavaScript 是单线程且非抢占式的,无法中断正在运行的代码。异步代码(例如超时和 AJAX 回调)在当前执行的代码返回到主事件循环之前无法运行。

      setTimeout 中的计时器在被调用时立即启动。但是由于单线程设计,直到你当前的所有 JS 完成后才能调用回调。如果这比计时器花费的时间更长,那么回调将被延迟。因此,您只能保证回调将在至少该时间段内被调用——它可能会更长,但不会更短。事件队列中还可能有其他异步回调。

      【讨论】:

        猜你喜欢
        • 2021-02-20
        • 2019-06-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-08-07
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多