使用JavaScript在特定延迟后执行脚本

使用JavaScript在特定延迟后执行脚本,javascript,settimeout,Javascript,Settimeout,是否有类似jQuery的JavaScript方法delay()或wait()(将脚本的执行延迟一段特定的时间)?您需要使用并向其传递回调函数。不能在javascript中使用sleep的原因是,在此期间,您会阻止整个页面执行任何操作。这不是一个好计划。使用Javascript的事件模型并保持快乐。不要反抗 有以下几点: setTimeout(function, milliseconds); 可以传递函数执行时间的函数 请参阅:。您还可以使用定期重复运行某些代码。只需稍微扩展一下。。。您可以在s

是否有类似jQuery的JavaScript方法
delay()
wait()
(将脚本的执行延迟一段特定的时间)?

您需要使用并向其传递回调函数。不能在javascript中使用sleep的原因是,在此期间,您会阻止整个页面执行任何操作。这不是一个好计划。使用Javascript的事件模型并保持快乐。不要反抗

有以下几点:

setTimeout(function, milliseconds);
可以传递函数执行时间的函数


请参阅:。

您还可以使用定期重复运行某些代码。

只需稍微扩展一下。。。您可以在
setTimeout
调用中直接执行代码,但正如前面所说,您通常会分配一个回调函数,如下所示。时间是毫秒

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

除了其他人所说的关于设置超时的内容之外: 如果将来要使用参数调用函数,则需要设置一些匿名函数调用

您需要将函数作为参数传递,以便稍后调用。实际上,这意味着名称后面没有括号。以下内容将立即调用警报,并显示“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”。

要添加先前的评论,我想说以下几点:

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


没有一个函数可以真正暂停JavaScript内置的执行。但是,您可以编写自己的函数,通过使用
Date()
函数并添加所需的时间间隔,执行类似于无条件循环的操作,直到到达时间为止。

如果您真的想使用阻塞(同步)
延迟
函数(无论什么),为什么不这样做:

<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>

功能延迟(毫秒){
var cur_d=新日期();
var cur_ticks=cur_d.getTime();
var ms_passed=0;
while(ms_通过
如果您只需要测试延迟,可以使用以下方法:

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

但这可能不是最好的生产方式。关于这一点的更多信息,在评论中,我有一些ajax命令,我想在两者之间延迟运行。下面是一个简单的例子,说明了一种方法。不过,我已经准备好为我的非传统做法而被撕成碎片。:)

您可以复制代码块并将其粘贴到控制台窗口中,然后看到如下内容:

Loading: 03.077
Loaded: 03.078
A: 03.079
B: 04.075
C: 05.075
D: 06.075
E: 07.076
done: 08.076

为什么你不能把密码放在承诺后面?(在我头顶上输入)

新承诺(功能(解析、拒绝){
setTimeout(resolve,2000);
}).然后(函数(){
log('做任何你想推迟的事');
});简单的回答是:

setTimeout(
    function () {
        x = 1;
    }, 1000);
上述函数等待1秒(1000毫秒),然后将x设置为1。
显然这是一个例子;您可以在匿名函数中执行任何操作

我非常喜欢Maurius对调用
setTimeout
的三种不同方法的解释(最高投票率的响应)

在我的代码中,我希望在AJAX保存事件完成后自动导航到上一页。保存事件的完成在CSS中有一个轻微的动画,表示保存成功

在我的代码中,我发现前两个示例之间存在差异:

setTimeout(window.history.back(), 3000);
这一个并不等待超时——无论我为延迟输入了什么数字,back()几乎立即被调用

但是,将此更改为:

setTimeout(function() {window.history.back()}, 3000);
这正是我所希望的

这并不特定于back()操作,同样的情况也发生在
alert()
中。基本上,对于第一种情况中使用的
alert()
,延迟时间被忽略。当我关闭弹出窗口时,CSS的动画将继续


因此,我推荐他描述的第二或第三种方法,即使您使用的是内置函数而不是参数。

正如其他人所说,setTimeout是您最安全的选择
但有时您无法将逻辑与新函数分离,然后您可以使用Date.now()获取毫秒数,然后自己进行延迟

功能延迟(毫秒延迟){
毫秒延迟+=日期。现在();
while(Date.now()警报(“#我回来了”#日期:“+新日期())延迟调用函数的最简单解决方案是:

function executeWithDelay(anotherFunction) {
    setTimeout(anotherFunction, delayInMilliseconds);
}
延迟功能:

/**
 * delay or pause for some time
 * @param {number} t - time (ms)
 * @return {Promise<*>}
 */
const delay = async t => new Promise(resolve => setTimeout(resolve, t));
await delay(1000);

不应使用setInterval(),而应使用setTimeout
setTimeout()
执行一次,
setInterval()
重复执行。如果您希望代码每5秒运行一次,则为该作业生成
setInterval()
。它不是执行的表达式,而是函数@马吕斯的回答说明了这一点。这不是拖延,而是叉子。延迟应该在同一个线程中工作。这将立即执行函数\u引用。要“工作”(异步),应该声明为:setTimeout(函数(){MethodToCall();},1000);我想指出,我们正在讨论
/**
 * delay or pause for some time
 * @param {number} t - time (ms)
 * @return {Promise<*>}
 */
const delay = async t => new Promise(resolve => setTimeout(resolve, t));
await delay(1000);