是否存在类似于jQuery delay() wait()的JavaScript方法(在特定时间内延迟执行脚本)?

有帮助吗?

解决方案

有以下内容:

setTimeout(function, milliseconds);

可以在执行函数之前传递的函数。

请参阅: Window setTimeout()方法

其他提示

只是添加其他人对 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'。

只是扩展一点...您可以直接在 setTimeout 调用中执行代码,但是 @ patrick 说,你通常会分配一个回调函数,就像这样。时间是毫秒

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}

如果你真的想要一个阻塞(同步) 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>

您需要使用 setTimeout 并向其传递回调函数。您无法在javascript中使用sleep的原因是因为您在此期间阻止整个页面执行任何操作。不是一个好的计划。使用Javascript的事件模型并保持愉快。不要打它!

您还可以使用 window.setInterval()运行一些定期重复编码。

要添加之前的评论,我想说以下内容:

JavaScript中的 setTimeout()函数本身不会暂停脚本的执行,而只是告诉编译器在将来的某个时间执行代码。

没有一个函数可以实际暂停JavaScript内置的执行。但是,您可以使用 Date()函数并添加所需的时间间隔来编写自己的函数,该函数执行无条件循环,直到达到时间为止。

如果您只需要测试延迟,可以使用:

function delay(ms) {
   ms += new Date().getTime();
   while (new Date() < ms){}
}

然后,如果你想延迟2秒,你可以:

delay(2000);

虽然可能不是最好的制作。更多关于评论的内容

为什么你不能把代码放在承诺背后? (键入我的头顶)

new Promise(function(resolve, reject) {
  setTimeout(resolve, 2000);
}).then(function() {
  console.log('do whatever you wanted to hold off on');
});

简单回复是:

setTimeout(
    function () {
        x = 1;
    }, 1000);

上述功能等待1秒(1000 ms),然后将x设置为1。 显然这是一个例子;你可以在匿名函数中做任何你想做的事情。

我真的很喜欢Maurius的解释(最高的upvoted响应),使用三种不同的方法来调用 setTimeout

在我的代码中,我希望在完成AJAX保存事件后自动导航到上一页。 save事件的完成在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

延迟调用函数的最简单方法是:

function executeWithDelay(anotherFunction) {
    setTimeout(anotherFunction, delayInMilliseconds);
}

正如其他人所说,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 ' +new Date());

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top