javascript - 脚本延迟不起作用

标签 javascript html datetime canvas timer

我在 javascript 中有一个 sleep 函数对象-

    function sleep(ms) { 
        var d = new Date(); 
        var target=d.getTime()+ms; 
        var next = d; 
        console.log('Slept');
        while(next.getTime()<=target) {
            next=new Date(); 
        }
        console.log('Woke Up');
        return;
    }

使用此 sleep(5000) 打印出来(在控制台中)

Slept

5秒后

Woke Up

此代码也可以正常工作 - alert('foo'); sleep (5000);警报('酒吧'); 首先是 foo,5 秒后是 bar

但是这个函数

//ctx is a 2d context of a canvas
function go() {
    ctx.fillRect(100,100,200,200); 
    sleep(1000); 
    ctx.fillRect(200,200,300,300); 
    sleep(1000);
    ctx.fillRect(300,300,400,400); 
    sleep(1000);
    ctx.fillRect(400,400,500,500);
}

go();

不工作。我的意思是它正在工作,但不是它应该的方式。首先控制台显示 -

Slept
//1 second later
Woke Up  
//1 second later  
Slept
//1 second later
Woke Up
Slept
//1 second later
Woke Up

在打印完所有这些消息后,图形(矩形)被绘制在 Canvas 上。 有没有办法在不使用 setTimeoutsetInterval 的情况下完成此操作?

问题 - 为什么fillRect 不能与我的sleep 函数一起使用? 有没有办法在不使用 setTimeoutsetInterval 的情况下延迟 javascript 中的某些代码?

最佳答案

您必须以异步方式实现您的 sleep() 函数(即 setTimeout() 或 setInterval())。您这样做的方式是阻止浏览器的所有操作,例如渲染和绘画;只有在您将控件返回给浏览器后,您的矩形才会被绘制。

关于javascript - 脚本延迟不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15240970/

相关文章:

javascript - Nuxtjs 和 Axios 上的计算属性?

javascript - 如何在javascript变量中获取事件选项卡的值?

javascript - 如果我使用 appendChild() 或 jQuery.append(),动态加载 JavaScript 文件是不同的

HTML 按钮和 div 出现在导航栏上,但使用 z-index 会破坏动画

javascript - 工具提示无法与任何不使用 :active state 的元素正常工作

C# - 为什么 DateTime.MinValue 和 MaxValue 不是编译时常量?

python - 从日期时间列中提取日期作为数组

javascript - DiscordJS - 从数组中嵌入随机图像

javascript - 加载音频缓冲区并使用音频标签播放它

java - 如何在android中获取一个地方的时区?