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中没有这样的东西。您必须使用 setTimeOutsetInterval 来完成。 没错 :) php 中的 sleep() 非常方便。 我知道是对的......希望他们正在努力:) 不会发生。它违背了 JavaScript 的所有原则 我找到了这个选项:setTimeout(() = > do something, time);但我找不到这方面的文档。但它的工作。 【参考方案1】:

Javascript 是单线程的。您可以使用setTimemout 推迟操作,但线程将继续。所以

function some() 
  doStuff();
  setTimeout(otherStuff, 1000);
  doMoreStuff();

随后将运行doStuffdoMoreStuff,并在一秒钟后运行otherStuff。这就是为什么使用 setTimeout 作为延迟本身是无用且不可能的。如果doMoreStuff 应该被推迟,你应该为延迟进行回调:

function some() 
  doStuff();
  setTimeout(doMoreStuff, 1000);

otherstuffdoMoreStuff 都延迟:

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 传递带参数的函数无效果

js setTimeout如何调用自身所在的函数(有参数传递的)?

js settimeout干啥用

js中的setTimeout和setinterval 用法说明

js闭包

js setTimeout 传递参数