Answers:
function_reference
除非包含在内,否则不会立即执行()
。即function_reference
仅仅是-参考;传入function_reference()
将立即调用该函数。
只是添加到其他人都说过的内容上setTimeout
:如果将来要使用参数调用函数,则需要设置一些匿名函数调用。
您需要将函数作为参数传递,以便稍后调用。实际上,这意味着名称后没有方括号。以下将立即调用警报,并显示“ Hello world”:
var a = "world";
setTimeout(alert("Hello " + a), 2000);
要解决此问题,您可以输入函数名称(如Flubba所做的那样),也可以使用匿名函数。如果需要传递参数,则必须使用匿名函数。
var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";
但是,如果运行该代码,您会注意到2秒钟后,弹出窗口将显示“ Hello Stack Overflow”。这是因为变量a的值在那两秒钟内发生了变化。要在两秒钟后说出“ Hello world”,您需要使用以下代码片段:
function callback(a){
return function(){
alert("Hello " + a);
}
}
var a = "world";
setTimeout(callback(a), 2000);
a = "Stack Overflow";
它将等待2秒钟,然后弹出“ Hello world”。
如果您真的想拥有阻塞(同步)delay
功能(无论如何),为什么不这样做:
<script type="text/javascript">
function delay(ms) {
var cur_d = new Date();
var cur_ticks = cur_d.getTime();
var ms_passed = 0;
while(ms_passed < ms) {
var d = new Date(); // Possible memory leak?
var ticks = d.getTime();
ms_passed = ticks - cur_ticks;
// d = null; // Prevent memory leak?
}
}
alert("2 sec delay")
delay(2000);
alert("done ... 500 ms delay")
delay(500);
alert("done");
</script>
delay
ing 之前刷新DOM (以回答此问题)。有什么办法吗?
您需要使用setTimeout并将其传递给回调函数。您无法在javascript中使用sleep的原因是因为您同时会阻止整个页面执行任何操作。这不是一个好计划。使用Javascript的事件模型并保持快乐。不要打!
您还可以使用window.setInterval()定期重复运行某些代码。
setTimeout()
做一次,setInterval()
重复做一次。如果您希望代码每5秒运行一次,setInterval()
就可以完成这项工作。
如果只需要测试延迟,则可以使用以下方法:
function delay(ms) {
ms += new Date().getTime();
while (new Date() < ms){}
}
然后,如果要延迟2秒钟,请执行以下操作:
delay(2000);
虽然可能不是最适合生产的。评论中的更多内容
我非常喜欢毛里乌斯用三种不同的致电方式做出的解释(最高的回应)setTimeout
。
在我的代码中,我想在完成AJAX保存事件后自动自动导航到上一页。保存事件的完成在CSS中略有动画,指示保存成功。
在我的代码中,我发现前两个示例有所不同:
setTimeout(window.history.back(), 3000);
这个函数不等待超时-不管我为延迟输入多少,back()都会立即被调用。
但是,将其更改为:
setTimeout(function() {window.history.back()}, 3000);
这正是我所希望的。
这并非特定于back()操作,与相同alert()
。基本上alert()
在第一种情况下使用时,将忽略延迟时间。当我关闭弹出窗口时,CSS的动画将继续。
因此,即使您使用的是内置函数而不使用参数,我也建议使用他描述的第二种或第三种方法。
我有一些ajax命令,希望在它们之间稍有延迟地运行。这是一种实现方法的简单示例。不过,由于我的非常规方法,我准备被撕成碎片。:)
// Show current seconds and milliseconds
// (I know there are other ways, I was aiming for minimal code
// and fixed width.)
function secs()
{
var s = Date.now() + ""; s = s.substr(s.length - 5);
return s.substr(0, 2) + "." + s.substr(2);
}
// Log we're loading
console.log("Loading: " + secs());
// Create a list of commands to execute
var cmds =
[
function() { console.log("A: " + secs()); },
function() { console.log("B: " + secs()); },
function() { console.log("C: " + secs()); },
function() { console.log("D: " + secs()); },
function() { console.log("E: " + secs()); },
function() { console.log("done: " + secs()); }
];
// Run each command with a second delay in between
var ms = 1000;
cmds.forEach(function(cmd, i)
{
setTimeout(cmd, ms * i);
});
// Log we've loaded (probably logged before first command)
console.log("Loaded: " + secs());
您可以复制代码块并将其粘贴到控制台窗口中,然后看到类似以下内容的内容:
Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076
延迟功能:
/**
* delay or pause for some time
* @param {number} t - time (ms)
* @return {Promise<*>}
*/
const delay = async t => new Promise(resolve => setTimeout(resolve, t));
内部用法async
:
await delay(1000);
就像其他人说的那样,setTimeout是您最安全的选择,
但是有时您无法将逻辑分离到新函数中,那么可以使用Date.now()来获取毫秒数并自行进行延迟...。
function delay(milisecondDelay) {
milisecondDelay += Date.now();
while(Date.now() < milisecondDelay){}
}
alert('Ill be back in 5 sec after you click OK....');
delay(5000);
alert('# Im back # date:' +new Date());