下面这个函数并没有像我想要的那样工作;作为一个JS新手,我不明白为什么。
我需要它等待5秒,然后检查newState是否为-1。
目前,它不会等待,它只是直接检查。
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
下面这个函数并没有像我想要的那样工作;作为一个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);
}
任何其他代码将立即执行。
创建这样一个以毫秒为单位等待的函数的最好方法是,这个函数将在参数中提供的毫秒内等待:
函数waitSeconds(imillisecseconds) { Var计数器= 0 , start = new Date().getTime() , end = 0; while (counter < imillisecseconds) { end = new Date().getTime(); Counter = end - start; } }
setTimeout(function() {
$('.message').hide();
}, 5000);
这将隐藏'。5秒后消息' div。
如果你在一个异步函数中,你可以简单地在一行中完成:
console.log(1);
await new Promise(resolve => setTimeout(resolve, 3000)); // 3 sec
console.log(2);
供你参考,如果目标是NodeJS,你可以使用这个内置函数(这是一个预定义的setTimeout函数):
import { setTimeout } from 'timers/promises';
await setTimeout(3000); // 3 sec