人类开始感知时间间隔在 20 到 10 秒之间,因此尝试使用 1 毫秒的值进行轮询既没有必要也不可取(任何现代浏览器都会将其舍入到 5 毫秒或 10 毫秒)。像 50 或 100 这样的值会更合适。
我还强烈建议使用链接的一系列setTimeout
调用而不是setInterval
调用,如下所示:
function onVideoReady(callback) {
// Do first check as soon as the JavaScript engine is available to do it
setTimeout(checkVideoReady, 0);
// Our check function
function checkVideoReady() {
if (videoIsReady) {
// The video is ready, notify calling code
callback();
}
else {
// Not ready yet, wait a 10th of a second
setTimeout(checkVideoReady, 100);
}
}
}
...然后您可以像这样使用它:
onVideoReady(function() {
// The video is ready, do something
});
我提倡链式系列的原因setTimeout
是setInterval
:
您可以轻松地在迭代之间更改延迟。例如在上面,我第一次尽快触发检查,然后在每次 100 毫秒后触发。你可以用时间做比这更复杂的事情,灵活性就在那里。
由于代码必须显式地触发下一个循环,因此无意中运行多个循环要困难得多。
setInterval
浏览器之间的差异在于它是从最后一次调用的开始还是结束时测量界面。如果您使用上述模式,您始终可以确定它是从最后一次检查结束时开始的。
如果您的代码在下一个间隔发生时仍在运行,它就会被跳过。这可能会导致间隙(例如,如果您每 100 毫秒执行一次操作,而您的上一个循环需要 102 毫秒才能完成,下一个循环不会尽快开始,它会等待剩余的 98 毫秒),至少在某些浏览器上是这样。
但这取决于你,当然,上面的操作可以像使用调用链一样简单地使用setInterval
and调用来完成。clearInterval
setTimeout