Почему здесь используется функция setTimeout? - PullRequest
4 голосов
/ 17 января 2012

Следующий код взят из Essential JavaScript Design Patterns для начинающих . Почему здесь используется функция setTimeout?

var pubsub = {};
(function(q) {

    var topics = {},
        subUid = -1;

    q.publish = function(topic, args) {

        if (!topics[topic]) {
            return false;
        }

        setTimeout(function() {
            var subscribers = topics[topic],
                len = subscribers ? subscribers.length : 0;

            while (len--) {
                subscribers[len].func(topic, args);
            }
        }, 0);

        return true;

    };

    q.subscribe = function(topic, func) {

        if (!topics[topic]) {
            topics[topic] = [];
        }

        var token = (++subUid).toString();
        topics[topic].push({
            token: token,
            func: func
        });
        return token;
    };

    q.unsubscribe = function(token) {
        for (var m in topics) {
            if (topics[m]) {
                for (var i = 0, j = topics[m].length; i < j; i++) {
                    if (topics[m][i].token === token) {
                        topics[m].splice(i, 1);
                        return token;
                    }
                }
            }
        }
        return false;
    };
}(pubsub));

1 Ответ

2 голосов
/ 17 января 2012

Таким образом, функция publish немедленно возвращается, каким-то образом планируя выполнение данного блока кода для немедленного выполнения (асинхронно).

Похоже, что это уведомляет группу слушателей, поэтому автор хотел запуститьцикл уведомлений позже, не блокируя код publish.Также обратите внимание, что результат уведомления (если таковой имеется) не требуется для клиентского кода.

Побочным эффектом является то, что если один из подписчиков выдает исключение, метод publish не затрагивается (другой вызовстек).

Может быть, это не идиоматично, но это довольно распространенный шаблон в JavaScript.Иногда он также используется для запуска других событий / тайм-аута, особенно в очень длительной функции.

...