素人がプログラミングを勉強していたブログ

プログラミング、セキュリティ、英語、Webなどのブログ since 2008

連絡先: twitter: @javascripter にどうぞ。

nextTick、setTimeout(fn, 0)の代わり

setTimeout(fn, 0)より高速な関数は最近はこんな感じのを使うといいと思う。

var nextTick;

if (typeof setImmediate === 'function') {
    nextTick = setImmediate;
} else if (typeof process === 'object' && typeof process.nextTick === 'function') {
    nextTick = process.nextTick;
} else if (typeof MessageChannel === 'function') {
    (function () {

        var channel = new MessageChannel();
        var queue = null;
        channel.port1.onmessage = function () {
            try {
                queue.fn(); 
            } finally {
                queue = queue.next;
            }
        };

        nextTick = function (fn) {
            queue = {
                fn: fn,
                next: queue
            };
            channel.port2.postMessage();
        };

    })();
} else {
    nextTick = function (fn) {
        setTimeout(fn, 0);
    };
}

処理を非同期化したい時に使うと良い。ブラウザでのアニメーション時はrequestAnimationFrame/setTimeoutを使うべきである。