为什么我们需要将函数传递给Javascript setTimeOut https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout
为什么我们不能像
那样简单setTimeOut(1000);
我可以在那里传递空或无功能吗?
我想在每次迭代后等待for循环。
答案 0 :(得分:9)
Javascript是单线程的。您可以使用setTimemout
推迟操作,但线程将继续。所以
function some() {
doStuff();
setTimeout(otherStuff, 1000);
doMoreStuff();
}
随后会运行doStuff
和doMoreStuff
,并在一秒后运行otherStuff
。这就是为什么使用setTimeout
作为延迟本身是无用的,也是不可能的。如果doMoreStuff
应该推迟,您应该将延迟回调:
function some() {
doStuff();
setTimeout(doMoreStuff, 1000);
}
或otherstuff
和doMoreStuff
延迟:
function some() {
doStuff();
setTimeout(function () {
otherStuff();
doMoreStuff()
}, 1000);
}
也许我对this SO-question的回答也很有用。
答案 1 :(得分:2)
setTimeout在事件循环中注册一个偶数。当JavaScript完成所有当前指令后,它将返回事件循环并等待事件发生。当它这样做时,它会调用回调函数,这是你传递给setTimeout的函数。
要使用setTimeout执行for循环,请执行以下操作:
function loop(i, n) {
doStuff();
if (i < n) {
setTimeout(function() {
loop(i+1, n);
}, 1000);
}
};
loop(0, 10);
其中i是当前迭代,n是最大迭代
当JavaScript不在事件循环中时,即它正在运行代码时,它会使整个浏览器无响应。只是闲置一秒就可以做到这一点,所以如果你在一个循环上迭代10次,浏览器就会没有响应10秒
答案 2 :(得分:1)
- &gt; setTimeout(callbackFunction[, interval])
这可以理解,因为您将在指定时间后调用具有指定名称(由您指定)的函数。
- &gt; 你不能这样做setTimeOut(1000);
因为1000会被视为回调函数因为setTimeout()
的第一个参数是回调函数。
您无法定义类似
的功能 function 1000() {
// Code Resides here.
}
因为java脚本不允许这些类型的函数名称。
- &gt; 您可以将匿名函数传递给setTimeout()
,如
setTimeout(function() {
// Code resides here.
}[, interval]);
上述功能代码将在给定间隔后执行。如果没有给出间隔,那么它将立即执行。
注意: - 方括号( [,] )中的参数是可选的。
<强> - &GT;您可以参考以下提到的主题供您使用: JavaScript sleep/wait before continuing
由于此线程包含的函数定义与其他语言中的sleep()
类似。
答案 3 :(得分:0)
现在可以通过快速的一行在Await / Async中实现:
await new Promise(resolve => setTimeout(resolve, 1000));
还有一个我认为与之相关的问题 Combination of async function + await + setTimeout