下面这个函数并没有像我想要的那样工作;作为一个JS新手,我不明白为什么。

我需要它等待5秒,然后检查newState是否为-1。

目前,它不会等待,它只是直接检查。

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

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

当前回答

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

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

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

其他回答

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

函数waitSeconds(imillisecseconds) { Var计数器= 0 , start = new Date().getTime() , end = 0; while (counter < imillisecseconds) { end = new Date().getTime(); Counter = end - start; } }

像这样使用延迟函数:

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

用法:

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

学分:如何延迟.keyup()处理程序,直到用户停止输入?

如果你有一个asyn函数,你可以这样做:

await new Promise(resolve => setTimeout(resolve, 5000));

浏览器

下面是一个使用新的async/await语法的解决方案。

一定要检查浏览器的支持,因为这是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");
};

这种方法的优点是,它使您的代码看起来和行为起来像同步代码。

node . js

Node.js 16提供了一个内置的setTimeout版本,它是基于承诺的,所以我们不需要创建自己的实用函数:

import { setTimeout } from "timers/promises";

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

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

⚠️为了记录,您可能会尝试使用等待函数来规避竞争条件(例如,在测试异步代码时)。这很少是个好主意。

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

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

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