【问题标题】:What is the purpose of calling setTimeout with a delay of 1?以 1 的延迟调用 setTimeout 的目的是什么?
【发布时间】:2013-02-06 23:17:11
【问题描述】:

quickstart guide for the Google Drive API 中,一旦加载了客户端库,就会调用以下函数:

// Called when the client library is loaded to start the auth flow.
function handleClientLoad() {
    window.setTimeout(checkAuth, 1);
}

像这样延迟1调用setTimeout而不是立即调用checkAuth的目的是什么?

【问题讨论】:

标签: javascript settimeout


【解决方案1】:

Javascript 具有异步 I/O (ajax/requests) 以及 setTimeoutsetInterval

以 1 毫秒(或 0)运行 setTimeout 的一个用途是告诉代码在其后的同步代码之后运行。这是一个例子

setTimeout(function(){
     alert("World");
},1); 
alert("Hello");

//alerts "Hello" then "World"

我想让我的回答简单明了,如果您有兴趣,the MDN article about it 中有更多关于 setTimeout 工作原理的详细信息

【讨论】:

  • 我打算提供一个链接,这对我的代表来说是致命的:P
【解决方案2】:

通过使用setTimeout,您可以让页面在checkAuth 函数完成之前进行交互。

基本上,您正在阻止checkAuth 阻止页面。

附带说明,HTML5 规范中规定的最小延迟是 5ms,所以 1ms 的等待实际上就是 5ms 的等待。如果回收该时间对您很重要,您可以使用 window.postMessage 以 0 毫秒的延迟获得相同的结果。这最初是为了处理跨域通信而设计的,但有a similar effect as setting a timeout with 0ms(你不能这样做,因为浏览器只允许 5ms - 或在某些旧浏览器中允许 10ms)。

最后,时间不能保证。 JavaScript 在单个线程上运行,因此当您将某些内容推送到计时器上时,它必须等待 JavaScript 其余部分的执行打开,然后才能轮到线程上运行——它不会并行运行。

【讨论】:

    【解决方案3】:

    setTimeout(function, 1) 将使function 在当前执行线程完成后运行。浏览器窗口中的 JavaScript 在单个线程中运行。因此,即使超时为 1,它也不会在当前执行结束后运行。例如考虑以下脚本:

    window.setTimeout(checkAuth, 1);
    
    // long code that takes 5 seconds to complete
    
    
    function checkAuth() {
        alert("i m here!");
    }
    

    在上面的示例中,您将在 5 秒后看到警报。

    【讨论】:

    • 在javascript中(除了node.js子进程/threads_a_gogo和web worker)只有一个执行线程。
    • @BenjaminGruenbaum 好吧,我确信它至少在浏览器中运行在一个线程中,这就是 OP 所关心的。但感谢您提供的信息。
    猜你喜欢
    • 2021-08-29
    • 2012-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多