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