jQuery:等待/延迟1秒而不执行代码


129

我无法.delay在jQuery中使用该方法:

$.delay(3000); // not working
$(queue).delay(3000); // not working

我正在使用while循环来等待,直到一个不受控制的更改值大于或等于另一个,并且在X秒内找不到任何方法来执行错误。


尝试在回调中使用setTimeout
theshadowmonkey 2012年

您正在使用哪个版本的jquery?
L7ColWinters 2012年

1
那不是延迟函数设计的目的,它是为在排队的jquery事件之间使用而设计的(例如fade()。delay()。show())。您需要setTimeOut函数。
2012年

@JoJa:在要点上您是正确的,但是show(和hide)的no参数形式不使用效果队列。
杰伊·汤姆滕

3
请说明您要延迟实现的目标。所有JavaScript都在单个线程上执行,并且将其冻结X秒可能会导致不良的用户体验。
德米特里Shkuropatsky'1

Answers:


176

$ .delay用于延迟队列中的动画,而不是暂停执行。

无需使用while循环,您需要递归地调用一个使用每秒执行一次检查的方法setTimeout

var check = function(){
    if(condition){
        // run when condition is met
    }
    else {
        setTimeout(check, 1000); // check again in a second
    }
}

check();

1
我认为,setTimeout就足够了。
杰穆拉特

3
您的炸弹兄弟,这正是我修复代码所需要的。
jemiloii 2014年

@Jiemurat和将来的其他任何人:setTimeout不会中断执行流程。涅斯纳的伟大法则获得了这一条件,直到条件变为现实!
Gabrer 2014年

如果您不需要中断执行流程,只需使用即可setTimeout()
2015年

我总是收到“检查不是函数”的信息,但是我的检查函数有两个参数
Black

211

您也可以通过这种方式延迟一些操作:

setTimeout(function (){

  // Something you want delayed.

}, 5000); // How long do you want the delay to be (in milliseconds)? 

7
仅供参考,这不会中断执行流程,因此,如果您需要“停止一切”几秒钟,则需要Niessner发布的内容。
2015年

是的...它是对该函数的回调,并且不会阻止。感谢您的回答,它解决了我的问题。
Bertus Kruger

如果频率极短,并且我们希望此功能可以永远运行,最终会否使堆栈崩溃?
自杀兔子

16

ES6 setTimeout

setTimeout(() => {
  console.log("we waited 204586560000 ms to run this code, oh boy wowwoowee!");
}, 204586560000);

编辑:204586560000毫秒是原始问题和这个答案之间的大概时间...假设我计算正确。


2
使用从原始问题到这个答案的大概时间,这真的很不错
Fuzzybear

9

jQuery的delay功能旨在与效果和效果队列一起使用,请参见其中的delay文档和示例:

$('#foo').slideUp(300).delay(800).fadeIn(400);

如果您想观察变量的变化,可以执行以下操作

(function() {
    var observerInterval = setInterval(function() {
        if (/* check for changes here */) {
           clearInterval(observerInterval);
           // do something here
        }
    }, 1000);
})();

setInterval有第二个必需参数,时间以毫秒为单位;)
sara_thepot 2015年

1
感谢@ sara.potyscki,已修复。
朱利安·D。

@JulianD。谢谢你的建议。我在搜寻解决方案时遇到了这个问题。这正是我的项目所需要的。
谢丽尔·韦莱兹

8

JavaScript setTimeout是一个很好的解决方案:

function funcx()
   {
   // your code here
   // break out here if needed
   setTimeout(funcx, 3000);
   }

funcx();

delayjQuery中的函数主要用于延迟jQuery动画队列中的动画。


5

delay()不会停止代码流,然后重新运行它。在JavaScript中没有实际的方法可以做到这一点。一切都必须通过带有回调的函数来完成,例如setTimeout其他人已经提到的。

jQuery的目的delay()是使动画队列在执行之前等待。因此,例如,$(element).delay(3000).fadeIn(250);将使元素在3秒后淡入。


5

只有JavaScript,它将在没有jQuery的情况下工作

<!DOCTYPE html>
<html>
    <head>
        <script>
            function sleep(miliseconds) {
                var currentTime = new Date().getTime();
                while (currentTime + miliseconds >= new Date().getTime()) {
                }
            }

            function hello() {
                sleep(5000);
                alert('Hello');
            }
            function hi() {
                sleep(10000);
                alert('Hi');
            }
        </script>
    </head>
    <body>
        <a href="#" onclick="hello();">Say me hello after 5 seconds </a>
        <br>
        <a href="#" onclick="hi();">Say me hi after 10 seconds </a>


    </body>
</html>

1
循环使用javascript等待是一个坏主意!循环运行时,所有JavaScript功能都将停止。这将产生意想不到的副作用。最好使用setTimeout()之类的非阻塞函数。
凯文·

4

Javascript是一种异步编程语言,因此您不能在一段时间内停止执行。可以停止执行的唯一方法是使用setTimeout(),它不是延迟,而是“延迟的函数回调”。


2

如果您使用的是ES6功能,并且处于异步功能中,则可以使用此功能将代码执行有效地暂停一段时间:

const delay = millis => new Promise((resolve, reject) => {
  setTimeout(_ => resolve(), millis)
});

这是您的用法:

await delay(5000);

它将停顿请求的毫秒数,但前提是您处于异步函数中。下面的例子:

const myFunction = async function() {
  // first code block ...

  await delay(5000);

  // some more code, executed 5 seconds after the first code block finishes
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.