Javascript 如何使用jQuery';s delay()作为sleep()?

Javascript 如何使用jQuery';s delay()作为sleep()?,javascript,jquery,Javascript,Jquery,jQuery可以用作sleep()或wait()函数吗?等待后挂起语句的执行。我尝试了$()。延迟(5000),但没有5秒的等待。delay()是否仅用于效果 我不是在寻找涉及另一个函数的setTimeout延迟执行或占用CPU的解决方案。我想要一个sleep()函数,它可以在不同的脚本中重用 添加: 我不是想建议一个根本不使用setTimeout的解决方案。我见过一些解决方案,它们要求将所有需要延迟的代码移到自己的函数中,以便setTimeout可以调用它。我不想那样。使用setTimeout

jQuery可以用作sleep()或wait()函数吗?等待后挂起语句的执行。我尝试了$()。延迟(5000),但没有5秒的等待。delay()是否仅用于效果

我不是在寻找涉及另一个函数的setTimeout延迟执行或占用CPU的解决方案。我想要一个sleep()函数,它可以在不同的脚本中重用

添加:

我不是想建议一个根本不使用setTimeout的解决方案。我见过一些解决方案,它们要求将所有需要延迟的代码移到自己的函数中,以便setTimeout可以调用它。我不想那样。使用setTimeout的自包含包装函数或在虚拟非视觉效果中使用jQuery delay(),只是为了模拟睡眠函数。

Javascript(扩展为jQuery)没有真正的“睡眠”函数。你可以或多或少地滥用setTimeout和setInterval(以及它们的衍生物,比如延迟)来模拟睡眠,但你通常最好只是适应setInterval/Timeout的做事方式。。。弄清楚你想要做什么,把它封在一个函数中,作为一个参数传递给这两个函数中的一个

编辑:

好的,我看到你的编辑了。你真的想要一个传统的睡眠功能。下面的内容绝对是一种滥用,完全不是我所推荐的。但如果我必须构建一个来拯救我的生命,我会这样做:测试大量循环需要多长时间,做统计上显著的测试,平均结果,并使用这些信息定义一个函数,将给定的毫秒数大致转换为循环数,然后它就通过了

在JavaScript中:

function timeloop(cycles) { 
    var start = new Date().getTime(); 
    for(var j=0; j<cycles; j++); 
    var end = new Date().getTime(); 
    return end-start; 
}


var sleep = (function () {
    var ms_tally = 0, i, s = 100, L = 10000;

    for(i=0; i<s; i++) 
        ms_tally += timeloop(L);
    var avg = ms_tally / i;
    var ms_per_cycle = avg / L;
    var cycles_per_ms = 1 / ms_per_cycle;

    return eval('function (ms) { for(var k=0, z=ms*'+cycles_per_ms+'; k<z; k++); }');
})()
函数timeloop(循环){
var start=new Date().getTime();

对于(var j=0;j您将不走运。任何
sleep()
函数都很可能需要使用
setTimeout
(或者可能是
setInterval
)。事实上,它本身使用
setTimeout
。来源于jQuery 1.4.2:

delay: function( time, type ) {
    time = jQuery.fx ? jQuery.fx.speeds[time] || time : time;
    type = type || "fx";

    return this.queue( type, function() {
        var elem = this;
        setTimeout(function() {
            jQuery.dequeue( elem, type );
        }, time );
    });
},

仅适用于特效使用的队列(即
fx
队列)。可以使用自定义队列使用,如果不想占用CPU时间,则必须以某种方式使用
设置超时
或类似工具。以下是一个示例:

function myfn() {
    // make it so that `myvar` is in scope and can 
    // be shared by both `fn1` and `fn2`
    var myvar

    function fn1() {
        alert('foo')
        // set `bar` in the above `myfn`'s scope (without `var`)
        myvar = 'bar'
        // sleep for 1.2 seconds
        setTimeout(fn2, 1200)
    }

    function fn2() {
        alert(myvar)
    }
    fn1()
}
myfn()

这对我来说非常有效:

示例:


根据你的问题 如何将jQuery的delay()用作sleep()?并回答以下问题:

我尝试了$()。延迟(5000),但没有5秒的等待。是延迟() 只用于特效

您是否已经尝试过延迟为()的jQuery.queue()? 例如

$.fn.extend({
changeBgColor:函数(颜色){
返回此值。每个(函数(){
$(this.css(“背景色”,color);
});
}
});
$.fn.wait=函数(mls,回调){
返回此.delay(mls).queue(函数(){
$(“span”).text($(this.queue().length);
回调();
$(this.dequeue();
});    
};
$(文档).ready(函数(){
$(“#开始”)。单击(函数(){
var div=$(“div”);
div.delay(1000).队列(函数(){
$(“span”).text(div.queue().length);
div.css(“背景色”、“红色”)。文本(“红色”);
$(this.dequeue();
}).延迟(1000).队列(函数(下一个){
$(“span”).text(div.queue().length);
div.changeBgColor(“绿色”)。文本(“绿色”);
next();
});
div.wait(1000,函数(){
div.changeBgColor(“黄色”)。文本(“黄色”);
}).wait(1000,函数(){
div.changeBgColor(“蓝色”)。文本(“蓝色”);
});
});
});

开始


我见过的最近的一个插件是Ben Alman的
doTimeout
插件-但即使这样,以下链接方法的执行也不会因传递给
doTimeout
方法调用的时间间隔而延迟。它不存在,克服它,使用setTimeout!好吧,作为练习,我添加了一个常规的
睡眠
,但是。。。如果计时非常重要,就不要使用它。如果这阻止了浏览器后台进程的运行,它对我来说就不起作用。这取决于浏览器。我认为大多数浏览器都有各自的JavaScript上下文执行它自己的线程,这意味着理论上还有其他事情可以发生。不过,在实践中,我看到处理器咀嚼JS会锁住浏览器呃,我相信其他人也有。我认为像doTimeout这样的东西将是最接近实际的解决方案,让人感觉是循序渐进的。我使用了我找到的所有实现,但没有一个能正常工作。所以我使用setTimeout并拆分代码。
$.doTimeout(3000,function(){
    alert('yahoooooo!');
});