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

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

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

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

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

当前回答

浏览器

下面是一个使用新的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");
};

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

其他回答

浏览器

下面是一个使用新的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);
}

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

您真的不应该这样做,正确使用timeout是解决OP问题的正确工具,以及任何其他您只想在一段时间后运行某些内容的情况。约瑟夫·西尔伯在他的回答中很好地证明了这一点。然而,如果在一些非生产的情况下,你真的想挂起主线程一段时间,这将做到这一点。

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');

I've arrived here because I was building a simple test case for sequencing a mix of asynchronous operations around long-running blocking operations (i.e. expensive DOM manipulation) and this is my simulated blocking operation. It suits that job fine, so I thought I post it for anyone else who arrives here with a similar use case. Even so, it's creating a Date() object in a while loop, which might very overwhelm the GC if it runs long enough. But I can't emphasize enough, this is only suitable for testing, for building any actual functionality you should refer to Joseph Silber's answer.

setTimeout(function() {
     $('.message').hide();
}, 5000);

这将隐藏'。5秒后消息' div。

根据约瑟夫·西尔伯的回答,我会这样做,更一般一点。

你会得到你的函数(让我们根据问题创建一个函数):

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);

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