【问题标题】:Js: setTimeOut without function argument? [duplicate]Js:没有函数参数的setTimeOut? [复制]
【发布时间】: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);但我找不到这方面的文档。但它的工作。

标签: javascript timeout settimeout


【解决方案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()

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-05-31
        • 1970-01-01
        相关资源
        最近更新 更多