下面这个函数并没有像我想要的那样工作;作为一个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');
}
}
当前回答
根据约瑟夫·西尔伯的回答,我会这样做,更一般一点。
你会得到你的函数(让我们根据问题创建一个函数):
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);)但这只是例子。
其他回答
浏览器
下面是一个使用新的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);
}
任何其他代码将立即执行。
像这样使用延迟函数:
var delay = ( function() {
var timer = 0;
return function(callback, ms) {
clearTimeout (timer);
timer = setTimeout(callback, ms);
};
})();
用法:
delay(function(){
// do stuff
}, 5000 ); // end delay
学分:如何延迟.keyup()处理程序,直到用户停止输入?
你不应该只是尝试在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只在一个线程中运行代码,当循环时,其他任何东西都不能运行(不能调用其他事件处理程序)。因此,循环等待某个变量的改变永远不会起作用,因为没有其他代码可以运行来改变该变量。
根据约瑟夫·西尔伯的回答,我会这样做,更一般一点。
你会得到你的函数(让我们根据问题创建一个函数):
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);)但这只是例子。