javascript中的轮询
我正在使用[youtube api][1]了解视频何时被完全缓冲。getVideoLoadedFraction 当分数为1时,视频被完全缓冲,但我必须轮询此函数以检查它是否为1,然后获取时间,如:javascript中的轮询,javascript,api,youtube,Javascript,Api,Youtube,我正在使用[youtube api][1]了解视频何时被完全缓冲。getVideoLoadedFraction 当分数为1时,视频被完全缓冲,但我必须轮询此函数以检查它是否为1,然后获取时间,如: setInterval(display_fraction,1); 因为视频可能需要几十分钟 此轮询是否会在浏览器/客户端上造成沉重负载,从而影响视频流?有没有其他更好的轮询方法或方法来检测youtube何时完成缓冲 顺便说一句,youtube api的链接是: 人类开始感知20到10秒之间的时间间隔
setInterval(display_fraction,1);
因为视频可能需要几十分钟
此轮询是否会在浏览器/客户端上造成沉重负载,从而影响视频流?有没有其他更好的轮询方法或方法来检测youtube何时完成缓冲
顺便说一句,youtube api的链接是:
人类开始感知20到10秒之间的时间间隔,因此尝试以1ms的值进行轮询既不必要也不可取,任何现代浏览器都会将其舍入到5ms或10ms。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
});
…然后您可以这样使用:
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和clearInterval调用与setTimeout调用链一样容易实现上述功能。人类开始感知20到10秒之间的时间间隔,因此,尝试以1ms的值进行轮询既不是必要的,也不是可取的,任何现代浏览器都会将其四舍五入到5ms或10ms。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
});
…然后您可以这样使用:
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和clearInterval调用与setTimeout调用链一样可以轻松完成上述操作。链式超时的替代方法是链式超时。下面实现定期轮询和超时
var Promise = require('bluebird');
/**
* Periodically poll a signal function until either it returns true or a timeout is reached.
*
* @param signal function that returns true when the polled operation is complete
* @param interval time interval between polls in milliseconds
* @param timeout period of time before giving up on polling
* @returns true if the signal function returned true, false if the operation timed out
*/
function poll(signal, interval, timeout) {
function pollRecursive() {
return signal() ? Promise.resolve(true) : Promise.delay(interval).then(pollRecursive);
}
return pollRecursive()
.cancellable()
.timeout(timeout)
.catch(Promise.TimeoutError, Promise.CancellationError,function () {
return false;
});
}
你这样称呼它
poll(isVideoReady, pollingInterval, timeout).then(console.log);
请参阅。链式超时的替代方法是链式超时。下面实现定期轮询和超时
var Promise = require('bluebird');
/**
* Periodically poll a signal function until either it returns true or a timeout is reached.
*
* @param signal function that returns true when the polled operation is complete
* @param interval time interval between polls in milliseconds
* @param timeout period of time before giving up on polling
* @returns true if the signal function returned true, false if the operation timed out
*/
function poll(signal, interval, timeout) {
function pollRecursive() {
return signal() ? Promise.resolve(true) : Promise.delay(interval).then(pollRecursive);
}
return pollRecursive()
.cancellable()
.timeout(timeout)
.catch(Promise.TimeoutError, Promise.CancellationError,function () {
return false;
});
}
你这样称呼它
poll(isVideoReady, pollingInterval, timeout).then(console.log);
请参阅。为什么setTimeout而不是setInterval顺便说一句?@Kos:更新了答案以解决这个问题。那么重负载呢?此轮询是否会在浏览器/客户端上造成沉重的负载,从而影响视频流?@user1769686:这本身并不重要,不。浏览器不关心每秒钟做10次、5次或两次小事情,无论你选择什么。假设检查视频是否已完全加载并不是一个耗时的大操作,应该可以。显然,在您的目标浏览器和适当类别的最终用户机器上进行测试,以确定最佳使用间隔;您的里程数可能会有所不同。顺便说一句,为什么使用setTimeoutcheckVideoReady,0;对于第一次检查,为什么不直接使用checkVIdeoReady?此外,第二个setTimeout会将Timeout=0更改为Timeout=100?为什么setTimeout不是setInte
rval btw?@Kos:更新了答案以解决这个问题。重负载情况如何?此轮询是否会在浏览器/客户端上造成沉重的负载,从而影响视频流?@user1769686:这本身并不重要,不。浏览器不关心每秒钟做10次、5次或两次小事情,无论你选择什么。假设检查视频是否已完全加载并不是一个耗时的大操作,应该可以。显然,在您的目标浏览器和适当类别的最终用户机器上进行测试,以确定最佳使用间隔;您的里程数可能会有所不同。顺便说一句,为什么使用setTimeoutcheckVideoReady,0;对于第一次检查,为什么不直接使用checkVIdeoReady?此外,第二次设置超时会将超时值=0更改为超时值=100?