下面这个函数并不像我想的那样工作;作为一个JS新手,我无法找出原因。
我需要它在检查 "newState "是否为 "1 "之前等待5秒。
目前,它并没有等待,只是直接检查。
function stateChange(newState) {
setTimeout('', 5000);
if(newState == -1) {
alert('VIDEO HAS STOPPED');
}
}
你真的不应该这样做,正确使用超时是正确的工具,适用于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'的回答。
这里是使用新的[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
你不应该只是试图在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只在一个单线程中运行你的代码,当你在循环时,没有其他东西可以运行(没有其他事件处理程序可以被调用)。 因此,等待某些变量变化的循环永远不会成功,因为没有其他代码可以运行来改变该变量。
使用像这样的延迟函数。
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
如果你'在一个[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
最好的方法是创建这样一个以毫秒为单位的等待函数,这个函数将等待参数中提供的毫秒。
<! -- 开始片段: 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;
}
}
<!--结束片段-->
根据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);
),但这是针对例子而言。
我用它从edge或IE运行PC游戏。 而且它在7秒后会自动关闭IE Edge。
火狐和谷歌浏览器不能用这种方式启动游戏。
<html<body>
<a href="E:\game\game.exe" name="game" onmouseout="waitclose(7000);"> game
<img src="game.jpg" width="100%" height="97%" ></a>
<script>
function waitclose(ms){
var start = new Date().getTime();var end=start;
while(end < start + ms) {end = new Date().getTime();}
window.open('', '_self', ''); window.close();
}
</script>
</body></html>