【问题标题】:Implementing delay in javascript在javascript中实现延迟
【发布时间】: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();
                }
            }
        }
    }
}
&lt;canvas id="myCanvas" width="600" height="600"&gt;

【问题讨论】:

  • 试试setTimeout(scrndrwdel, 1000)
  • 尝试在 setTimeout 调用中删除函数调用周围的 (),使其看起来像这样:setTimeout(scrndrwdel, 1000);
  • 当我在浏览器调试器中删除括号时,单步执行不会输入带有用于绘制线条的语句的括号。不知道为什么会发生这种情况,因为示例与您关于不包括括号的响应相匹配。如果没有括号,则在调试器外部运行时屏幕无法绘制。在调试器中,它只是在 setTimeout 行和函数 scrndrwdel() 之间循环。切勿对括号内的代码进行排序。我很感激这个领导。
  • 循环中的setTimeout inside 有什么意义?这基本上设置了 360 个计时器,每个计时器都在同一时间触发,即页面加载后 1 秒。
  • 好吧,我显然不了解 setTimeout 函数。我的印象是 setTimeout 会延迟代码执行指定时间(1000mSec),然后运行代码。完成括号内的代码后,它将返回循环,并再次通过代码排序,并有 1000 毫秒的延迟。我没有意识到延迟的所有 360 实例会同时触发。是否有一个函数可以迭代延迟而不是一次全部触发?

标签: javascript settimeout


【解决方案1】:

在查看了各种推荐的网站后,很明显,最简单的方法就是使用“setInterval”。代码被重写,如下所示。代码运行,绘制屏幕,​​并等待它再次被“setInterval”触发。触发代码以每 2 毫秒重新运行一次。

如果我理解正确,其他语言中的“暂停”、“等待”等方法将无法正常工作,因为它会锁定浏览器,直到超时结束。

var c = document.getElementById("myCanvas");
var ctx = c.getContext("2d");
var angle = 0;
ctx.fillStyle = "#ffffff";

draw_line();
setInterval(draw_line, 2);

function draw_line() {
    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 = "#00ff00";
    ctx.stroke();

    // ctx.arc(150, 150, 10, 0, 2*Math.PI);
    // ctx.strokeStyle = "#ff0000";
    // ctx.stroke();

    if (angle < 360) {
        angle = angle + 0.25;
    } else {
        angle = 0;
    }

    for (var i = 1; i <= 5; i++) {
        ctx.beginPath();
        ctx.arc(300, 300, (50 * i), 0, 2 * Math.PI);
        ctx.lineWidth = 1;
        ctx.strokeStyle = "#00ff00";
        ctx.stroke();
    }
}
&lt;canvas id="myCanvas" width="600" height="600"&gt;

【讨论】:

【解决方案2】:

你可以这样做:

function send () {
	console.log('OK');
  setTimeout(send, 10000);
}

setTimeout(send, 1000);

setTimeout 函数的第一次运行在他运行console.logsetTimeout 函数之后执行,内部有一个新的延迟:)

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-02
相关资源
最近更新 更多