为什么在这里使用setTimeout函数?

时间:2012-01-17 18:05:32

标签: javascript settimeout

以下代码来自Essential JavaScript Design Patterns For Beginners。为什么在这里使用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 个答案:

答案 0 :(得分:2)

这样publish函数立即返回,以某种方式调度给定的代码块,以便稍后(异步)执行。

看起来它通知了一堆侦听器,因此作者想要稍后运行通知循环,而不是阻止publish代码。另请注意,客户端代码不需要通知结果(如果有)。

副作用是,如果其中一个订阅者抛出异常,publish方法不会受到影响(不同的调用堆栈)。

也许它不是惯用语,但它是JavaScript中非常常见的模式。有时它也用于让其他事件/超时运行 - 特别是在非常长时间运行的函数中。