一行代码实现 nextTick

发布于 2021-11-25 13:39:21 字数 1944 浏览 1368 评论 0

nextTick 来源于 NodeJS,意思是将当前的 callback 放到队列的尾部。

实现

/**
 * 下一刻
 * @param callback {Function} 回调
 */
var nextTick = function (callback) {
    setTimeout(callback);
};

众所周知,setTimeout 的超时时间是在当前队尾之后的 4ms+(具体待考证),得益于 MutationObserver 和 IE 的 onreadystatechange,可以实现更快的执行。

/**
 * 下一刻
 * @param callback {Function} 回调
 */
var nextTick = function (callback) {
    // chrome18+, safari6+, firefox14+,ie11+,opera15
    if (MutationObserver) {
        var observer = new MutationObserver(callback);
        var a = document.createElement('a');

        observer.observe(a, {
            attributes: true
        });
        a.setAttribute('a', String(Math.random()));
    }
    // ie
    else if ('VBArray' in window) {
        var script = document.createElement('script');
        // IE下这个通常只要 1 ms,而且没有副作用,不会发现请求
        script.onreadystatechange = function () {
            callback(); //在interactive阶段就触发
            script.onreadystatechange = null;
            document.body.removeChild(script);
            script = null;
        };

        document.body.appendChild(script);
    } else {
        setTimeout(callback, 0);
    }
};

参考资料

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据

关于作者

旧城烟雨

暂无简介

0 文章
0 评论
402 人气
更多

推荐作者

文章 0 评论 0

云雾

文章 0 评论 0

夏尔

文章 0 评论 0

alipaysp_yxYxYl56FW

文章 0 评论 0

涙—继续流

文章 0 评论 0

    我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
    原文