在执行下一行之前等待5秒

下面这个函数并不像我想的那样工作;作为一个JS新手,我无法找出原因。

我需要它在检查 "newState "是否为 "1 "之前等待5秒。

目前,它并没有等待,只是直接检查。

function stateChange(newState) {
  setTimeout('', 5000);

  if(newState == -1) {
    alert('VIDEO HAS STOPPED');
  }
}
对该问题的评论 (1)

你必须把你的代码放在你提供给setTimeout的回调函数中。

function stateChange(newState) {
    setTimeout(function () {
        if (newState == -1) {
            alert('VIDEO HAS STOPPED');
        }
    }, 5000);
}

任何其他代码将立即执行。

评论(3)

你真的不应该这样做,正确使用超时是正确的工具,适用于OP'的问题和任何其他场合,你只是想在一段时间后运行一些东西。 Joseph Silber在他的回答中已经很好地证明了这一点。 但是,如果在一些非生产性的情况下,你****想把主线程挂起一段时间,这个就可以做到。

function wait(ms){
   var start = new Date().getTime();
   var end = start;
   while(end < start + ms) {
     end = new Date().getTime();
  }
}

以执行的形式。

console.log('before');
wait(7000);  //7 seconds in milliseconds
console.log('after');

我之所以来到这里,是因为我正在构建一个简单的测试用例,用于围绕长期运行的阻塞操作(即:昂贵的DOM操作)对异步操作进行排序,这是我模拟的阻塞操作。 昂贵的DOM操作),这是我模拟的阻塞操作。 它很适合这项工作,所以我想我把它贴出来,供其他有类似用例的人到达这里。 即便如此,它还是在 while 循环中创建了一个 Date() 对象,如果运行时间足够长,可能会让 GC 非常吃不消。 但我怎么强调都不为过,**这只适合测试,对于构建任何实际功能,你应该参考Joseph Silber'的回答。

评论(10)

这里是使用新的[async/await][1]语法的解决方案。

请确认[浏览器支持][2],因为这是ECMAScript 6引入的新功能。

帮助函数:

const delay = ms => new Promise(res => setTimeout(res, ms));

用途:

const yourFunction = async () => {
  await delay(5000);
  console.log("Waited 5s");

  await delay(5000);
  console.log("Waited an additional 5s");
};

这种方法的好处是,它使你的代码看起来和行为像同步代码。

[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await [2]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/await#Browser_compatibility

评论(3)

你不应该只是试图在javascript中暂停5秒。 它并不是那样工作的。 你可以安排一个函数的代码从现在开始运行5秒,但你必须把你想稍后运行的代码放到一个函数中,而该函数之后的其他代码将继续立即运行。

比如说

function stateChange(newState) {
    setTimeout(function(){
        if(newState == -1){alert('VIDEO HAS STOPPED');}
    }, 5000);
}

但是,如果你有这样的代码。

stateChange(-1);
console.log("Hello");

console.log()语句将立即运行。 它不会等到stateChange()函数中的超时触发之后。 你不能只是暂停javascript的执行,让它在预先设定的时间内运行。

相反,任何你想延迟运行的代码必须在setTimeout()回调函数中(或从该函数中调用)。

如果你真的试图通过循环来暂停,那么你基本上就会把Javascript解释器挂起一段时期。 因为Javascript只在一个单线程中运行你的代码,当你在循环时,没有其他东西可以运行(没有其他事件处理程序可以被调用)。 因此,等待某些变量变化的循环永远不会成功,因为没有其他代码可以运行来改变该变量。

评论(3)

使用像这样的延迟函数。

var delay = ( function() {
    var timer = 0;
    return function(callback, ms) {
        clearTimeout (timer);
        timer = setTimeout(callback, ms);
    };
})();

用法。

delay(function(){
    // do stuff
}, 5000 ); // end delay

功劳归于用户CMS,见https://stackoverflow.com/q/1909441/1066234

评论(0)

如果你'在一个[async函数][1]中,你可以简单地在一行中完成。

console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);

注意,如果目标是NodeJS,使用这个会更有效(它是一个预定义的承诺setTimeout函数)。

await setTimeout[Object.getOwnPropertySymbols(setTimeout)[0]](3000) // 3 sec

[1]: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/async_function

评论(0)

最好的方法是创建这样一个以毫秒为单位的等待函数,这个函数将等待参数中提供的毫秒。

<! -- 开始片段: js hide: false -->

function waitSeconds(iMilliSeconds) {
    var counter= 0
        , start = new Date().getTime()
        , end = 0;
    while (counter < iMilliSeconds) {
        end = new Date().getTime();
        counter = end - start;
    }
}

<!--结束片段-->

评论(0)

试试这个。


//the code will execute in 1 3 5 7 9 seconds later
function exec() {
    for(var i=0;i
评论(1)

根据Joseph Silber的[答案][1],我会这样做,更通用一点。

你会有你的函数(让我们根据问题创建一个)。

function videoStopped(newState){
   if (newState == -1) {
       alert('VIDEO HAS STOPPED');
   }
}

而且你可以有一个等待功能。

function wait(milliseconds, foo, arg){
    setTimeout(function () {
        foo(arg); // will be executed after the specified time
    }, milliseconds);
}

最后你会有。

wait(5000, videoStopped, newState);

这是一个解决方案,我宁愿在wait函数中不使用参数(只有foo();而不是foo(arg);),但这是针对例子而言。

[1]: https://stackoverflow.com/a/14226807/7747942

评论(0)

我用它从edge或IE运行PC游戏。 而且它在7秒后会自动关闭IE Edge。

火狐和谷歌浏览器不能用这种方式启动游戏。

评论(0)

创建新的Js函数

function sleep(delay) {
        var start = new Date().getTime();
        while (new Date().getTime() < start + delay);
      }

当你想延迟执行时调用该函数。 延时值使用int中的毫秒数。

####Some code
 sleep(1000);
####Next line
评论(1)

使用angularjs。

$timeout(function(){
if(yourvariable===-1){
doSomeThingAfter5Seconds();
}
},5000)
评论(0)