Яндекс.Метрика

    Javascript

    setImmediate через MessageChannel

    В данной статье будет коротко описан еще один метод реализации «нулевой» задержки setTimeout(callback, 0).
    Всем кому интересно — под кат.

    Коротко о главном


    Стандартный setTimeout делает минимальную задержку в несколько миллисекунд, в IE 10 даже изобрели setImmediate который позволяет устанавливать «нулевую» задержку. Про то, как это работает, хорошо написано тут ie.microsoft.com/testdrive/Performance/setImmediateSorting/Default.html

    Пример кода, который работает в Chrome, Safari, Opera  
    function setZeroTimeout(callback) {
    var channel = new MessageChannel();
    channel.port1.onmessage = callback;
    channel.port2.postMessage('');
    }


    Принцип работы прост, каналы связи в этом механизме реализованы в виде двух труб, с портами на каждом конце.

    Достоинства


    Достоинство этого метода в отличие от метода описанного в dbaron.org/log/20100309-faster-timeouts то, что будет работать в WebWorker'ах.

    Минусы


    Не все браузеры поддерживаются. Firefox не работает. т.к. не поддерживает MesageChannel и SharedWorker.

    Стандарт MessageChannel описан в документации www.whatwg.org/specs/web-apps/current-work/complete/web-messaging.html#channel-messaging