我试图做的是写一个函数,如:
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");
这段代码应该做的是一次打印一个字母到屏幕上,每个字母打印间隔半秒
答案 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);