Js:没有函数参数的setTimeOut? [复制]
Posted
技术标签:
【中文标题】Js:没有函数参数的setTimeOut? [复制]【英文标题】:Js: setTimeOut without function argument? [duplicate] 【发布时间】:2015-04-09 00:39:56 【问题描述】:为什么我们需要传递一个函数给javascript setTimeOut https://developer.mozilla.org/en-US/docs/Web/API/WindowTimers.setTimeout
为什么我们不能像 sg simple 那样做
setTimeOut(1000);
我可以在那里传递一个空的或不存在的函数吗?
我只想在每次迭代后在 for 循环中等待。
【问题讨论】:
你的意思是像 php 中的sleep()
方法? Javascript中没有这样的东西。您必须使用 setTimeOut
或 setInterval
来完成。
没错 :) php 中的 sleep() 非常方便。
我知道是对的......希望他们正在努力:)
不会发生。它违背了 JavaScript 的所有原则
我找到了这个选项:setTimeout(() = > do something, time);但我找不到这方面的文档。但它的工作。
【参考方案1】:
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 的回答也很有用。
【讨论】:
@Kooilnc 在这篇文章中所有这些解决方案如何?:Post。您发布了一个不错的解决方案,但链接中的解决方案仅适用于两次迭代。通过两次以上的迭代,它只会继续触发并返回随机数。过去几年浏览器处理循环超时的方式是否发生了变化? @Mikey:检查我链接的问题的答案,并检查了该答案中的 jsfiddle (jsfiddle.net/KooiInc/k47rw5o4) 谢谢。解释了很多。【参考方案2】:现在可以在一行中使用 Await/Async:
await new Promise(resolve => setTimeout(resolve, 1000));
还有一个我认为相关的问题 Combination of async function + await + setTimeout
【讨论】:
【参考方案3】: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 秒内无响应
【讨论】:
【参考方案4】:--> setTimeout(callbackFunction[, interval])
这可以理解为您将在指定时间后调用具有指定名称(由您提供)的函数。
-->不能这样setTimeOut(1000);
,因为1000会被当作回调函数setTimeout()
的第一个参数是回调函数。
你不能像这样定义函数
function 1000()
// Code Resides here.
因为 java 脚本不允许使用这些类型的函数名。
-->你可以将匿名函数传递给setTimeout()
like
setTimeout(function()
// Code resides here.
[, interval]);
上述功能代码将在给定的时间间隔后执行。如果没有给出时间间隔,那么它将立即执行。
注意:- 方括号中给出的参数 ([, ]) 是可选传递的。
-->您可以参考下面提到的线程供您使用: JavaScript sleep/wait before continuing
因为这个线程包含一个函数定义,它在其他语言中的工作方式类似于sleep()
。
【讨论】:
以上是关于Js:没有函数参数的setTimeOut? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
js setTimeout如何调用自身所在的函数(有参数传递的)?