我是Javascript的新手,最近知道setTimeout设置为0 millis的用法。我正在尝试实现它,但没有得到预期的结果。根据我的知识,它必须等到所有事件都完成但它没有表现得很好。请告诉我我错过了什么或我错在哪里。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Test HTML</title>
</head>
<body>
<script src="js/index.js"></script>
</body>
</html>
(function(){
setTimeout(function () {
document.write("<p>Event 0 Processed !!</p>");
},0);
setTimeout(function () {
document.write("<p>Event 1 Processed !!</p>");
},1000);
setTimeout(function () {
document.write("<p>Event 2 Processed !!</p>");
},2000);
setTimeout(function () {
document.write("<p>Event 3 Processed !!</p>");
},3000);
})();
Event 0 Processed !!
Event 1 Processed !!
Event 2 Processed !!
Event 3 Processed !!
我期待像
这样的东西Event 1 Processed !!
Event 2 Processed !!
Event 3 Processed !!
Event 0 Processed !!
谢谢:)
答案 0 :(得分:6)
0
延迟function log(n) {
console.log("Event", n, "processed!");
}
setTimeout(log.bind(null, 0), 500); // wait 0.5 seconds
setTimeout(log.bind(null, 1), 0); // wait until the stack clears
log(2); // run now
等待当前调用堆栈清除,而不是事件队列。其他超时都将回调排入队列,因此它们不是调用堆栈的一部分。
如果您要立即调用日志记录功能,则0超时将等待该操作完成,但不会等待其他超时。例如:
0
&#13;
即使调用setTimeout时延迟为零,它也会被放置在队列中,并计划在下一次机会运行,而不是立即运行。当前执行代码必须在执行队列上的函数之前完成,生成的执行顺序可能不是预期的。
在删除的答案中提及Jeremy Starcher时,print "MEDIA = %.1f\n"%(((a*2)+(b*3)+(c*5))/(10))
的延迟为0毫秒。它会将回调放到队列的顶部,但不保证它实际上会立即运行。当前上下文必须退出,可以立即或永远不会发生。最重要的是,浏览器偶尔只会检查队列中是否有待处理的回调,因此实现可能会引入额外的延迟。
答案 1 :(得分:0)
这些语句从0到3000毫秒执行。
据我所知,它必须等到所有事件都结束..
不,他们应该等到您指定的时间(0,1000,2000或3000毫秒)
答案 2 :(得分:-1)
当你有这个:
setTimeout(function () {
document.write("<p>Event 0 Processed !!</p>");
},0);
接近说:
document.write("<p>Event 0 Processed !!</p>");
因为它会在执行前等待0ms,所以马上就会这样。
如果您希望订单方向相反,那么事件0的延迟需要最长。