【发布时间】:2018-02-06 13:04:55
【问题描述】:
我试图在循环中延迟脚本的执行。在查看了多个查询和答案后,我对信息感到不知所措,似乎无法对其进行整理。在与“setInterval”和“setTimeout”相关的答案中徘徊,在我看来,“setTimeout”是实现所需延迟的合适方法。
我想要做的是让一个循环画一组线并返回循环的开头,它会等待一段定义的时间(大约 250 毫秒 - 1000 毫秒),然后擦拭屏幕,增加值设置绘制一条线的位置并在新位置绘制下一条线。
使用 Firefox 的调试器单步执行代码,可以观察到该过程的发生。但是,当代码在调试器之外执行时,会出现延迟,并且只绘制代码最后增量的行。关于我做错了什么的任何建议?提前致谢。
代码如下:
var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
ctx.fillStyle = "#ffffff";
scrndrw();
function scrndrw() {
for (var angle = 1; angle < 361; angle++) {
setTimeout(scrndrwdel(), 1000);
function scrndrwdel() {
ctx.fillRect(0, 0, 600, 600);
ctx.beginPath();
ctx.moveTo(300, 300);
ctx.lineTo((((Math.cos(angle * (Math.PI / 180))) * 250) + 300), (((Math.sin(angle * (Math.PI / 180))) * 250) + 300));
ctx.lineWidth = 1;
ctx.strokeStyle = "#000000";
ctx.stroke();
ringdraw();
function ringdraw() {
for (var i = 1; i <= 5; i++) {
ctx.beginPath();
ctx.arc(300, 300, (50 * i), 0, 2 * Math.PI);
ctx.lineWidth = 3;
ctx.strokeStyle = "#000000";
ctx.stroke();
}
}
}
}
}
<canvas id="myCanvas" width="600" height="600">
【问题讨论】:
-
试试
setTimeout(scrndrwdel, 1000) -
尝试在
setTimeout调用中删除函数调用周围的(),使其看起来像这样:setTimeout(scrndrwdel, 1000);。 -
当我在浏览器调试器中删除括号时,单步执行不会输入带有用于绘制线条的语句的括号。不知道为什么会发生这种情况,因为示例与您关于不包括括号的响应相匹配。如果没有括号,则在调试器外部运行时屏幕无法绘制。在调试器中,它只是在 setTimeout 行和函数 scrndrwdel() 之间循环。切勿对括号内的代码进行排序。我很感激这个领导。
-
循环中的
setTimeoutinside 有什么意义?这基本上设置了 360 个计时器,每个计时器都在同一时间触发,即页面加载后 1 秒。 -
好吧,我显然不了解 setTimeout 函数。我的印象是 setTimeout 会延迟代码执行指定时间(1000mSec),然后运行代码。完成括号内的代码后,它将返回循环,并再次通过代码排序,并有 1000 毫秒的延迟。我没有意识到延迟的所有 360 实例会同时触发。是否有一个函数可以迭代延迟而不是一次全部触发?
标签: javascript settimeout