使用JavaScript执行特定延迟后的脚本
有没有JavaScript的方法类似于jQuery的delay()
或wait()
(延迟脚本的执行一段特定的时间)?
有以下几点:
setTimeout(function, milliseconds);
函数可以被传递的时间后,该函数将被执行。
请参阅: 窗口setTimeout()
方法 。
只是添加到其他人对setTimeout所说的话:如果你想在将来调用带有参数的函数,你需要设置一些匿名函数调用。
您需要将该函数作为parameter passing给稍后调用。 实际上这意味着名称后面没有括号。 以下将立即调用警报,并显示“Hello world”:
var a = "world"; setTimeout(alert("Hello " + a), 2000);
要解决这个问题,你可以把一个函数的名字(如Flubba已经完成)或者你可以使用匿名函数。 如果你需要传递一个参数,那么你必须使用一个匿名函数。
var a = "world"; setTimeout(function(){alert("Hello " + a)}, 2000); a = "Stack Overflow";
但是如果你运行这个代码,你会注意到2秒后popup窗口会显示'Hello Stack Overflow'。 这是因为variablesa的值在这两秒钟内发生了变化。 为了让它在两秒钟后说'Hello world',你需要使用下面的代码片段:
function callback(a){ return function(){ alert("Hello " + a); } } var a = "world"; setTimeout(callback(a), 2000); a = "Stack Overflow";
它会等待2秒,然后popup'Hello world'。
只是扩展一点点…你可以直接在setTimeout调用中执行代码,但@patrick说,通常你会像这样分配一个callback函数。 时间是毫秒
setTimeout(func, 4000); function func() { alert('Do stuff here'); }
如果你真的想有一个阻塞(同步) delay
function(无论什么),为什么不做这样的事情:
<script type="text/javascript"> function delay(ms) { var cur_d = new Date(); var cur_ticks = cur_d.getTime(); var ms_passed = 0; while(ms_passed < ms) { var d = new Date(); // Possible memory leak? var ticks = d.getTime(); ms_passed = ticks - cur_ticks; // d = null; // Prevent memory leak? } } alert("2 sec delay") delay(2000); alert("done ... 500 ms delay") delay(500); alert("done"); </script>
您也可以使用window.setInterval()定期重复运行一些代码。
你需要使用setTimeout并传递一个callback函数。 你不能在JavaScript中使用睡眠的原因是因为在此期间你会阻止整个页面做任何事情。 不是一个好计划。 使用Javascript的事件模型,并保持快乐。 不要战斗!
为了补充以前的评论,我想说以下几点:
JavaScript中的setTimeout()
函数本身并不会暂停脚本的执行,而只是告诉编译器在将来某个时候执行代码。
没有一个函数可以实际上暂停内build在JavaScript中的执行。 但是,您可以编写自己的函数,通过使用Date()
函数并添加所需的时间间隔,直到达到时间为止,执行类似于无条件循环的操作。
如果你只需要testing延迟,你可以使用这个:
function delay(ms) { ms += new Date().getTime(); while (new Date() < ms){} }
然后,如果你想延迟2秒钟,你可以:
delay(2000);
虽然可能不是最好的生产。 更多的在评论中
简单的答复是:
setTimeout( function () { x = 1; }, 1000);
上面的函数等待1秒(1000毫秒),然后将x设置为1.显然这是一个例子; 你可以在匿名函数中做任何你想做的事情。
你为什么不能把代码放在承诺之后呢? (打在我头上)
new Promise(function(resolve, reject) { setTimeout(resolve, 2000); }).then(function() { console.log('do whatever you wanted to hold off on'); });
我有一些ajax命令,我想在两者之间延迟运行。 这是一个简单的例子。 尽pipe我采取了非常规的做法,但我准备好被撕成碎片。 🙂
// Show current seconds and milliseconds // (I know there are other ways, I was aiming for minimal code // and fixed width.) function secs() { var s = Date.now() + ""; s = s.substr(s.length - 5); return s.substr(0, 2) + "." + s.substr(2); } // Log we're loading console.log("Loading: " + secs()); // Create a list of commands to execute var cmds = [ function() { console.log("A: " + secs()); }, function() { console.log("B: " + secs()); }, function() { console.log("C: " + secs()); }, function() { console.log("D: " + secs()); }, function() { console.log("E: " + secs()); }, function() { console.log("done: " + secs()); } ]; // Run each command with a second delay in between var ms = 1000; cmds.forEach(function(cmd, i) { setTimeout(cmd, ms * i); }); // Log we've loaded (probably logged before first command) console.log("Loaded: " + secs());
您可以复制代码块并将其粘贴到控制台窗口中,并看到如下所示的内容:
Loading: 03.077 Loaded: 03.078 A: 03.079 B: 04.075 C: 05.075 D: 06.075 E: 07.076 done: 08.076
我真的很喜欢用三种不同的方法调用setTimeout的方式来使用Maurius的解释(最高的响应)。
在我的代码中,我想在AJAX保存事件完成时自动导航到前一页。 保存事件的完成在CSS中有轻微的animation,表示保存成功。
在我的代码中,我发现前两个例子有所不同:
setTimeout(window.history.back(), 3000);
这个不会等待超时 – 无论我input什么数字,都会立即调用back()。
但是,将其更改为:
setTimeout(function() {window.history.back()}, 3000);
这正是我所希望的。
这不是特定于back()操作, alert()
。 基本上用第一种情况下使用的alert()
,延迟时间被忽略。 当我closurespopup框时,CSS的animation继续。
因此,即使您使用内置函数而不使用参数,我也会推荐他描述的第二种或第三种方法。