【问题标题】:How to write a JavaScript function that will wait given milliseconds [duplicate]如何编写一个等待给定毫秒的JavaScript函数[重复]
【发布时间】:2016-05-05 04:28:28
【问题描述】:

我试图做的是编写一个函数,例如:

function delay(delay){
    var date = new Date();
    var startTime = date.getTime();


    var currDate=new Date();
    var current=currDate.getTime();

    while (current<=startTime+delay){
        currDate=new Date();
        current=currDate.getTime();
    }
}

在执行此类操作时,此代码似乎可以完美运行

console.log("1");
delay(500);
console.log("2");

当做这样的事情时,它会打印到控制台1,然后等待半秒,然后打印出2。问题是我不想console.log,我想document.getElementById("id").innerHTML+="a";。当尝试围绕延迟功能时,页面会等待所有延迟完成,然后再加载任何 a。

我的问题如下:

是否有一个好的方法来编写这样的函数,或者已经有一个函数可以允许所有之前的代码运行,导致指定的延迟,然后运行它之后的代码。我试过使用setTimeout,但问题是运行这样的东西:

console.log("1");
setTimeout(function(){
    console.log("2");
}, 2000);
console.log("3");

导致它打印 1,然后打印 3,然后等待 2 秒并打印 2,而不是执行 1,等待 2 秒,打印 2,打印 3

澄清:我试图实现这一点的方式是:

for (i=0;i<10;i++){
    document.getElementById("text")+="a";
    delay(500);    
}

这段代码应该做的是一次打印一个字母到屏幕上,每个字母打印之间有半秒

【问题讨论】:

  • 如果您不想在2 之前打印,为什么不在setTimeout 中添加console.log(3)

标签: javascript jquery delay settimeout wait


【解决方案1】:

您可以使用回调实现类似的功能:

function execute_after_delay( cb, msg, delay ){
   setTimeout(function(){
       console.log("2");
       cb(msg);
   }, delay);
}
console.log("1");
execute_after_delay(console.log, 3, 2000);

【讨论】:

    【解决方案2】:

    setTimeout 是正确的方法。

    你会想要的

    console.log("1");
    setTimeout(function(){
        console.log("2");
        console.log("3");
    }, 2000);
    

    将记录“1”,等待 2 秒,然后按顺序记录“2”和“3”。

    您的示例不起作用的原因是setTimeout 是异步的。这意味着传递给setTimeout 的函数在setTimeout 被调用后的2 秒内被调度,但程序将继续执行以下任何行。任何你想等到延迟之后的东西都应该在 setTimeout 内的块中。

    如果您想在延迟后进一步延迟,您可以在回调函数中调用setTimeout

    例如:

    console.log("1");
    setTimeout(function(){
        console.log("2");
        setTimeout(function() {
            console.log("3");
        }, 1000);
    }, 2000);
    

    这将记录“1”,等待 2s,记录“2”,等待 1s,然后记录“3”。

    --

    有延迟的循环:

    当 () { 控制台.log("1"); (2000); 控制台.log("2"); 控制台.log("3"); }

    变成

    var loop = function() {
      console.log("1");
      setTimeout(function() {
        console.log("2");
        console.log("3");
        if (<condition>) {
          loop();
        }
      });
    };
    

    请注意,对于大量迭代,您可能会超出可用堆栈。在这种情况下,您可以采取一些解决方法,例如 setTimeout(loop, 0);

    【讨论】:

    • 这个问题是我想在一个循环中运行代码并且我想要一个特定的动作发生,然后等待,然后 for 循环应该继续
    • 我已经更新了我的问题以包含我希望我的代码执行的操作
    • 换句话说,我如何在设计为异步的语言和环境中做同步的事情(异步=不等待事情)?问题是,如果你用一个紧凑的 while 循环来占用 CPU,就像你在问题中所做的那样,UI 的响应将会受到影响。
    • 如果要继续循环,请查看更新后的答案
    猜你喜欢
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2021-11-17
    • 2020-03-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多