以下代码取自Project Silk(Microsoft示例应用程序)
下面的发布方法循环通过一个事件callBacks数组并执行每一个.而不是使用for循环而是使用setInterval.
文档说这允许在前一个回调完成之前调用每个订阅者回调.它是否正确?我认为浏览器不允许在间隔内执行该函数,直到它的所有先前执行完成为止.
这和for循环有什么不同吗?
that.publish = function (eventName, data)
{
var context, intervalId, idx = 0;
if (queue[eventName])
{
intervalId = setInterval(function ()
{
if (queue[eventName][idx])
{
context = queue[eventName][idx].context || this;
queue[eventName][idx].callback.call(context, data);
idx += 1;
}
else { clearInterval(intervalId); }
}, 0);
}
解决方法:
在这里使用setInterval会使执行排序为“异步”,因为它会在下次主执行线程可用时安排回调的执行.
这意味着回调执行不应该阻止浏览器,因为任何其他同步处理将在回调之前发生(因为回调被安排为仅在主执行线程具有备用毫秒时运行) – 这就是使这个构造“更好”的原因“比常规for循环 – 回调不会阻止浏览器并导致可怕的事实”这个页面有一个太长的脚本“错误.
这种调度模式的副作用是超时只是一个“建议” – 这就是他们在这里使用0的原因.
见:http://ejohn.org/blog/how-javascript-timers-work/