Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
javascript中的轮询_Javascript_Api_Youtube - Fatal编程技术网

javascript中的轮询

javascript中的轮询,javascript,api,youtube,Javascript,Api,Youtube,我正在使用[youtube api][1]了解视频何时被完全缓冲。getVideoLoadedFraction 当分数为1时,视频被完全缓冲,但我必须轮询此函数以检查它是否为1,然后获取时间,如: setInterval(display_fraction,1); 因为视频可能需要几十分钟 此轮询是否会在浏览器/客户端上造成沉重负载,从而影响视频流?有没有其他更好的轮询方法或方法来检测youtube何时完成缓冲 顺便说一句,youtube api的链接是: 人类开始感知20到10秒之间的时间间隔

我正在使用[youtube api][1]了解视频何时被完全缓冲。getVideoLoadedFraction

当分数为1时,视频被完全缓冲,但我必须轮询此函数以检查它是否为1,然后获取时间,如:

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?