如何编写一个等待给定毫秒的JavaScript函数

时间:2016-05-05 04:28:29

标签: javascript jquery delay settimeout wait

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

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,我想要{{1} }。当尝试围绕延迟功能时,页面会在加载任何a之前等待所有延迟完成。

我的问题如下:

是否有一种很好的方法来编写这样的函数,或者是否已经有一个函数,它可以允许所有以前的代码运行,导致指定的延迟,然后运行代码。我尝试过使用document.getElementById("id").innerHTML+="a";,但问题是运行这样的事情:

setTimeout

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

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

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

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

2 个答案:

答案 0 :(得分:0)

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”,等待2秒,记录“2”,等待1秒,然后记录“3”。

-

延迟循环:

while(){   的console.log( “1”);   (2000);   的console.log( “2”);   的console.log( “3”); }

变为

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

请注意,对于大量迭代,您可能会超出可用堆栈。在这种情况下,您可以采用setTimeout(loop, 0);

之类的解决方法

答案 1 :(得分:0)

你可以使用回调来实现类似的东西:

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);