Javascript 可以使用setInterval异步调用函数吗?

Javascript 可以使用setInterval异步调用函数吗?,javascript,asynchronous,setinterval,Javascript,Asynchronous,Setinterval,以下代码取自ProjectSilk(一个Microsoft示例应用程序) 下面的publish方法循环通过一个事件回调数组并执行每个回调。而不是使用for循环,而是使用setInterval 文档中说,这允许在前一次回调完成之前调用每个订户回调。这是正确的吗?我认为浏览器不会允许在间隔内执行函数,直到之前所有的执行都完成 这真的和做for循环有什么不同吗 that.publish = function (eventName, data) { var context, intervalI

以下代码取自ProjectSilk(一个Microsoft示例应用程序) 下面的publish方法循环通过一个事件回调数组并执行每个回调。而不是使用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(…,0)
可用于向浏览器UI提供控制,以防止在代码运行时间过长时冻结它

在本例中,
that.publish
将在执行任何回调之前立即退出。然后,每个回调都将“在后台”运行—它们将被放置在事件循环中,并且在执行下一个回调之前,每个回调都会让浏览器执行它的操作

在事件处理中,这似乎是一个好主意,因为您不希望事件处理冻结浏览器,即使有很多浏览器或某些浏览器需要很长时间才能完成


关于文档-如上所述,它是不正确的。Javascript是单线程的。但是,如果连续调用几次
publish()
,则这些调用确实会在执行任何回调之前完成,因为
setTimeout
。也许这就是文档的意思?

在这里使用setInterval确实会使执行有点“异步”,因为它会在下次主执行线程可用时安排回调的执行

这意味着回调执行不应阻塞浏览器,因为任何其他同步处理都将在回调之前进行(因为回调计划仅在主执行线程有空闲毫秒的情况下运行)——这就是使此构造“更好”的原因与常规for循环相比,回调不会阻塞浏览器并导致可怕的“此页面有一个花费太长时间的脚本”错误

这种调度模式的副作用是超时只是一个“建议”——这就是为什么他们在这里使用0


请参阅:

您是否在寻找类似的内容:我有兴趣了解这段代码是否实现了文档中声称的功能。因为如果是这样的话,我对
setInterval
的工作方式有些不理解。我不明白,尤其是因为JS是单线程的。
setInterval(…,0)
回调在浏览器再次控制之前不会被触发,所以
setInterval
调用实际上是在说“浏览器,一旦我完成了,调用这个函数”。这也是我的想法。那么为什么要在一个简单的for循环上这样做呢?