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

Niy*_*yaz 185 javascript settimeout

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

Mar*_*ius 235

只是为了添加其他人所说的内容setTimeout:如果你想在将来调用带参数的函数,你需要设置一些匿名函数调用.

您需要将该函数作为参数传递给它以便稍后调用.实际上,这意味着名称后面没有括号.以下将立即调用警报,它将显示"Hello world":

var a = "world";
setTimeout(alert("Hello " + a), 2000);
Run Code Online (Sandbox Code Playgroud)

要解决此问题,您可以输入函数的名称(如Flubba所做的那样),也可以使用匿名函数.如果需要传递参数,则必须使用匿名函数.

var a = "world";
setTimeout(function(){alert("Hello " + a)}, 2000);
a = "Stack Overflow";
Run Code Online (Sandbox Code Playgroud)

但是如果运行该代码,您会注意到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";
Run Code Online (Sandbox Code Playgroud)

它将等待2秒然后弹出"Hello world".


Abh*_*nav 184

有以下内容:

setTimeout(function, milliseconds);
Run Code Online (Sandbox Code Playgroud)

可以在执行函数之后传递的函数.

请参阅:窗口setTimeout()方法.

  • 这不是延迟,它是一个分叉.延迟应该在同一个线程中工作. (111认同)
  • 延迟应该同步工作.这是异步的. (23认同)
  • 这将立即执行function_reference.要"工作"(异步),它应该表示为:setTimeout(function(){MethodToCall();},1000); (13认同)
  • 我想指出我们谈论的是JavaScript; 提出"线程"或它应该"同步"工作可能是真的*技术上*和*语义*但是并不真正适合JavaScript的上下文,考虑到实际上没有办法用这两种方法之一实现延迟(你不像在其他语言中那样在JS中创建"线程").此外,除非包含`()`,否则不会立即执行`function_reference`.即`function_reference`就是那个 - 一个参考; 传入`function_reference()`会立即调用该函数. (6认同)
  • 它不是一个执行它的表达式的函数.@Marius的回答说明了这一点. (3认同)

Pol*_*nby 35

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

setTimeout(func, 4000);
function func() {
    alert('Do stuff here');
}
Run Code Online (Sandbox Code Playgroud)


Mar*_*ner 27

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

  • 一个更紧凑的例程:函数延迟(ms){var start_time = Date.now(); while(Date.now() - start_time <ms); } (3认同)
  • 该解决方案的难点在于它主动使用处理器,这导致功率使用增加并且可用于其他线程/进程(例如其他选项卡,其他程序)的资源减少.相反,睡眠会暂时中止线程对系统资源的使用. (2认同)
  • 当然,它是 CPU 密集型的,但对于快速和肮脏的测试它是有效的 (2认同)

Pat*_*ick 15

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

  • 它仍然可用于测试目的.就像延迟表单提交几秒钟来评估页面更改,然后再发出新的HTTP请求. (2认同)

rco*_*oup 14

您还可以使用window.setInterval()以固定间隔重复运行某些代码.

  • `setTimeout()`执行一次,`setInterval()`重复执行.如果您希望代码每5秒运行一次,则为该作业创建`setInterval()`. (8认同)
  • 不应该使用setInterval()而应该使用setTimeout (2认同)

小智 11

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

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

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


Chr*_*fer 11

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

function delay(ms) {
   ms += new Date().getTime();
   while (new Date() < ms){}
}
Run Code Online (Sandbox Code Playgroud)

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

delay(2000);
Run Code Online (Sandbox Code Playgroud)

可能不是最适合制作的.更多关于评论的内容

  • 嗯,这是一个繁忙的循环,会耗尽笔记本电脑和其他移动设备的电池,并且可能还会阻止 UI 响应(甚至显示)。 (2认同)
  • 在开发中可以很好地运行快速和脏(和临时)解决方案. (2认同)

Al *_*lin 5

您为什么不能将代码放在承诺的后面?(从我的头顶输入)

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


Luc*_*uca 5

简单的答复是:

setTimeout(
    function () {
        x = 1;
    }, 1000);
Run Code Online (Sandbox Code Playgroud)

上面的函数等待1秒钟(1000毫秒),然后将x设置为1。您可以在匿名函数内做任何您想做的事情。