`
yiminghe
  • 浏览: 1452888 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

setTimeout 0间隔问题

阅读更多

关于 setTimeout 相关的文章:

 

setTimeout ,xhr,event 线程问题


使用 javascript Workers 进行计算


Analyzing Timer Performance


Revenge of the Timers


On JavaScript, EDP, and 0ms timeouts

 

 

总结:

 

1.由于javascript属于事件驱动编程(EDP Event Driven Programming),运行在浏览器中,则同其他 gui 程序一样要依赖于事件队列,并且界面操作为单线程。


2.在javascript中,一般不可以直接操作事件队列,但是通过 timer api(setTimeout, clearTimeout, setInterval, and clearInterval)事实上我们可以向事件队列发送低优先级的 timer events (WM_TIMER),即参数指定的时间并不一定能够精确保证。


3.即使当前事件队列为空并且设定了参数timeout为0,由于存在平台(操作系统,浏览器)相关的 timer resolution即最短 timeout 时间,并不能保证会立即执行 ,在xp sp3下,firefox3平均需要10ms,ie6需要16毫秒,chrome4则只需要4ms,才会开始执行。

 

postMessage:

 

由于 html5 引入 window.postMessage 事实上给我们除了timer之外的操作事件队列的方式,可以自定义事件放入事件队列中,即不存在 timer api的限制 ,在 setTimeout: how to get the shortest delay 即利用了这点,提供了标准兼容浏览器下最接近0的timeout

 

(function () {
    var timeouts = [];
    var messageName = "zero-timeout-message";
    function setZeroTimeout(fn) {
        timeouts.push(fn);
        window.postMessage(messageName, "*");
    }
    function handleMessage(event) {
        if (event.source == window && event.data == messageName) {
            event.stopPropagation();
            if (timeouts.length > 0) {
                var fn = timeouts.shift();
                fn();
            }
        }
    }
    window.addEventListener("message", handleMessage, true);
    window.setZeroTimeout = setZeroTimeout;
})();
 

 

 

 

 

 

分享到:
评论

相关推荐

    Javascript中, setTimeout() 和 setInterval() 的方法

    这样的写法能够确保每次调用之间有足够的间隔,避免了`setInterval()`可能导致的问题。 总之,`setTimeout()`和`setInterval()`是JavaScript中用于处理时间调度的核心工具,它们的正确使用对于编写健壮的前端应用至...

    Javascript定时器 三 setTimeout func 0

    尽管`setTimeout(func, 0)`在很多情况下能帮助我们解决异步问题,但过度使用可能导致性能下降,因为每次调用都会增加事件循环的负担。同时,由于其依赖于事件循环,执行顺序可能并不确定,因此在编写依赖于特定执行...

    Javascript定时器(二)——setTimeout与setInterval

    另一个区别是,由于`setTimeout`的异步性质,它可以在函数执行完毕后再执行,而`setInterval`则会在设定的间隔时间结束后立即尝试执行,即使前一次的执行还未完成。 在实际开发中,`setTimeout`常用于实现动画效果...

    模态对话框导致setTimeout失效的解决方案(一)

    `setTimeout`函数用于在指定的时间间隔后执行一个函数或一段代码。它返回一个唯一的ID,可以用来取消已设置的定时器。然而,当模态对话框打开时,页面的主执行线程被阻塞,使得与用户交互相关的事件无法立即响应,这...

    给c#添加SetTimeout和SetInterval函数.docx

    `SetTimeout` 函数的主要作用是在指定的时间间隔后执行一次指定的代码块。这与 JavaScript 中的 `setTimeout` 类似。下面给出具体的实现代码: ```csharp using System; using System.Timers; public static class...

    模态对话框导致setTimeout无效的解决方案(二)

    `setTimeout`是一个异步执行的函数,它允许开发者在指定的时间间隔后执行一段代码。通常,这个函数在网页的主线程中运行,而模态对话框会阻塞主线程,等待用户与其交互。因此,当模态对话框打开时,`setTimeout`的...

    解决vue.js中settimeout遇到的问题(时间参数短效果不稳定)

    解决这个问题的关键在于理解Vue的渲染流程,并确保setTimeout的间隔足够让Vue完成每次状态更新的渲染。对于弹窗关闭的情况,同样需要等待动画执行完毕再移除相关类,因此设置了600毫秒的延时。 下面是优化后的代码...

    JS中的setTimeout和setInterval的区别JS中的setTimeout和setInterval的区别

    在JavaScript编程中,`setTimeout`与`setInterval`是两个非常常用的函数,用于控制代码执行的时间间隔。虽然它们在功能上有一定的相似性,但其实现的效果却大不相同。下面我们将详细探讨这两个函数的工作原理、用法...

    setTimeout制作36选7

    总结一下,`setTimeout`在这里被用来创建一个模拟彩票抽奖的动画效果,通过控制代码的执行时机,使得数字的生成和显示具有时间间隔,从而增加了趣味性和可观察性。这样的实现方式在前端开发中很常见,特别是在需要...

    浅谈setTimeout 与 setInterval

    总的来说,`setTimeout`更适合用来延后执行一次性的任务,而`setInterval`适用于需要持续重复的任务,但要注意处理可能出现的间隔不准确问题。在使用`setInterval`时,通常需要考虑到函数执行时间和间隔时间的关系,...

    setTimeout使用注意事项1

    在Chrome浏览器中,连续嵌套调用 `setTimeout` 达到5次以上,如果时间间隔小于4毫秒,浏览器会自动将时间间隔设置为4毫秒,这是为了防止过度密集的定时器导致CPU繁忙。这是Chromium源码中的实现,目的是平衡性能和...

    setTimeout时间设置为0详细解析

    HTML5标准规定了`setTimeout`的最短间隔,通常不低于4毫秒,以防止过于频繁的调用。而在涉及到DOM更新和渲染时,`requestAnimationFrame`通常是个更好的选择,因为它会在下一次屏幕重绘之前执行,确保动画的流畅性。...

    js中settimeout方法加参数.docx

    在JavaScript编程中,`setTimeout`是一个非常实用且重要的功能,它用于在指定的时间间隔后执行某个函数或指定的一段代码。本文将深入探讨`setTimeout`方法及其参数的使用方式,并通过具体示例来帮助读者更好地理解和...

    setTimeout和setInterval的区别

    需要注意的是,使用`setInterval`时,由于JavaScript的事件循环机制,如果执行时间超过设定的间隔时间,可能导致多个回调函数同时执行,造成所谓的“堆积”。因此,在处理耗时任务时,通常建议使用`setTimeout`来...

    更快的异步执行(setTimeout多浏览器)

    如果要异步执行一个函数,我们最先想到的方法肯定会是setTimeout 例如:setTimeout(function...chrome下测试 setTimeout 0 的实际执行时间间隔大概在12ms左右。 那么如果想最快地异步执行一个函数,有没有什么可以提速

    深化理解setTimeout函数和setInterval函数_.docx

    JavaScript中的`setTimeout`和`setInterval`是两个非常重要的函数,它们主要用于在特定时间间隔后执行指定的函数或代码块。这两个函数对于创建动态、交互式的网页内容至关重要,如动画效果、倒计时、定时刷新内容等...

    JavaScript基于setTimeout实现计数的方法

    每次调用timedCount函数时,都会先增加count的值,然后设置一个新的setTimeout,间隔为1000毫秒(即1秒),之后再递归调用timedCount函数。 doTimer函数用于启动计数器。它首先检查timerOn变量是否为false,如果是...

    vue 解决setTimeOut和setInterval函数无效报错的问题

    `setTimeout`用于在指定时间后执行一次回调函数,而`setInterval`则会在固定间隔后反复执行回调函数。在使用`setInterval`时,记得在不再需要定时器执行时使用`clearInterval`清除,以避免资源浪费。 在Vue中,`...

    setTimeout和setInterval的浏览器兼容性分析

    问题出现在当调用AJAXRequest.update方法时,如果带了更新间隔及更新次数,那么在IE下面就会出现问题,具体表现为带了更新间隔时是函数工作,带上更新次数时函数无法在更新指定次数后停止执行。 测试几个例子之后...

    js中的setInterval和setTimeout使用实例.docx

    如果要求在每隔一个固定的时间间隔后就精确地执行某动作,那么最好使用 setInterval,而假如不想由于连续调用产生相互干扰的问题,尤其是每次函数的调用需要繁重的计算以及很长的处理时间,那么最好使用 setTimeout...

Global site tag (gtag.js) - Google Analytics