竞争条件:在加载React之前尝试播放视频

时间:2018-01-30 20:30:40

标签: javascript reactjs video

我正在使用ReactJS中的视频播放器。基本上,我已经设置了一个基于cookie的介绍视频,它是可以跳过的。当它被跳过时,我希望我的主视频自动开始播放。我这样做的方式看起来像这样(问题出在setTimeout()部分,我知道这没有意义)

  skipIntro() {
    if (this.state.index === 0) {
        this.handleVisit(MAX_COOKIES_INTRO);
        this.setState({
            index: ++this.state.index,
        });
        this.videoRef.updatePlaybackTime(0);
        setTimeout(() => {
                            this.videoRef.play();
                          }, 0);
    }
}

如果我不使用setTimeout,则this.videoRef.play();不会执行。起初我以为是因为它是在主视频有时间加载之前被异步调用的。因为我等了0ms,我很困惑。为什么这样做?如果没有setTimeout调用,我真的更喜欢这样做。

1 个答案:

答案 0 :(得分:5)

setTimeout有点欺骗,因为它不会在它的时间后立即执行,而是在超时后将该函数添加到队列中。在0ms的情况下,它立即将其添加到当前队列而不是立即执行。

这并不一定意味着它会立即执行,而是将函数添加到队列中,其他调用可能正在等待执行。没有超时,它可能在需要进行任何其他调用之前执行。有关详情,请参阅this MDN page

在您的情况下,这可能意味着当您在没有setTimeout的情况下拨打电话时,主要视频播放所需的内容未完成,但在使用setTimeout时,您仍在延迟执行。

您还可以查看以下任一StackOverflow帖子:

What is setTimeout doing when set to 0 milliseconds?

Why is setTimeout(fn, 0) sometimes useful?