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

IT技术 javascript settimeout
2021-02-01 13:26:57

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

6个回答

只是补充一下其他人所说的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(function, milliseconds);

可以传递函数执行时间后的函数。

请参阅:窗口setTimeout()方法

它不是一个被执行的表达式,它是一个函数。@Marius 的回答说明了这一点。
2021-03-17 13:26:57
这不是延迟,而是分叉。延迟应该在同一个线程中工作。
2021-03-18 13:26:57
这将立即执行 function_reference。要“工作”(异步),它应该声明为: setTimeout(function () { MethodToCall(); }, 1000);
2021-04-04 13:26:57
我想指出我们在谈论 JavaScript;提出“线程”或它应该“同步”工作在技术语义上可能是正确的但并不真正适合 JavaScript 的上下文,考虑到这些方法中的任何一种都无法实现延迟(你不不像在其他语言中那样在 JS 中创建“线程”)。此外,function_reference除非您包含(). function_reference就是这样 - 一个参考;传入function_reference()将立即调用该函数。
2021-04-10 13:26:57

只是稍微扩展一下...您可以直接在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>
此解决方案的困难在于它主动使用处理器,这会导致功耗增加并减少可用于其他线程/进程(例如其他选项卡、其他程序)的资源。相比之下,睡眠会暂时挂起线程对系统资源的使用。
2021-03-11 13:26:57
最好使用 Date.now() 而不是 new Date() 并且不要考虑内存泄漏
2021-03-20 13:26:57
;(function(){function a(b,a){!0!==a&&(b*=1E3);for(var c=Date.now();Date.now()-c<b;);}window.hasOwnProperty("delay")||(window.delay=a)})();使用秒或毫秒。3 秒delay(3);示例: 500 毫秒示例:delay(500, true);
2021-03-25 13:26:57
更紧凑的例程:function delay(ms) { var start_time = Date.now(); while (Date.now() - start_time < ms); }
2021-04-03 13:26:57
当然,它是 CPU 密集型的,但对于快速和肮脏的测试,它是有效的
2021-04-06 13:26:57

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

尽管如此,它仍可用于测试目的。就像在发出新的 HTTP 请求之前将表单提交延迟几秒钟以评估页面更改一样。
2021-03-20 13:26:57
@rushinge 然后设置回调提交表单并禁用默认表单提交
2021-03-23 13:26:57