FED

©FrontEndDev.org
2015 - 2024
web@2.22.0 api@2.20.0

一行代码实现 nextTick

nextTick

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

参考资料