在javascript中睡眠-无设置超时

在javascript中睡眠-无设置超时,javascript,Javascript,这里所有的答案都不起作用 我只想在两个函数之间等待几秒钟,如下所示: do_fn1(); wait(5000); do_fn2(); 如果没有一个例子就说它们都不起作用,这是一个很重要的决定,因为我相信它们可能起作用 这个怎么样, do_fn1(); setTimeout(do_fn2, 5000); 我想你做不到。你可能不得不这么做 do_fn1(); window.setTimeout(do_fn2, 5000); 这里所有的答案都不起作用 他们当然会: function a()

这里所有的答案都不起作用

我只想在两个函数之间等待几秒钟,如下所示:

do_fn1();

wait(5000);

do_fn2();

如果没有一个例子就说它们都不起作用,这是一个很重要的决定,因为我相信它们可能起作用

这个怎么样,

do_fn1();
setTimeout(do_fn2, 5000);

我想你做不到。你可能不得不这么做

do_fn1();
window.setTimeout(do_fn2, 5000);
这里所有的答案都不起作用

他们当然会:

function a() {
  alert("I'm pretty sure...");
}

function b() {
  alert("...that they work just fine.");
}

a();
setTimeout(b, 5000);
发件人:

函数睡眠(毫秒){
var start=new Date().getTime();
对于(变量i=0;i<1e7;i++){
如果((新日期().getTime()-start)>毫秒){
打破
}
}
}
两个想法:

首先,为什么不将所有post delay语句包装成一个包装函数呢

 var postDelayFunc = function(){
   dosomething();
   dosomethingelse();
   onemorething();
 }
然后在代码中将此函数作为参数传递给setTimeout

 //your code
 dofunc1();
 setTimeout(postDelayFunc, 1000);
或者看看jQuery deferred:,尽管您可能最终会编写非常类似的代码

但有一件事打动了我,那就是你对其他答案的反应,以及可能出现混淆的地方。我认为您正在查看您的函数,并看到一个线程,您只想在继续之前保留一段时间

但不应该在javascript中这样做,因为它会占用整个浏览器,会让用户非常恼火。相反,当您使用setTimeout时,实际上所做的是指示当超时过期时,另一个线程将拾取并执行传入函数


一旦设置了超时,执行线程将继续执行下一行(这就是为什么您认为超时不起作用的原因)。您可能需要做的是设置超时,并将所有执行后步骤放入传递给计时器的函数中,如上所述。

我可能会使用另一种破解方法,但我个人不推荐。
在这里结账

函数解析睡眠(func){
var fdef=func.toString();
var fbody=fdef.match(/\{([\s\s]*)\}/)[1]。拆分(/sleep\(.*?\)\;?/);
var sleeps=fdef.match(/sleep\(.*)\)/g);
var fargs=fdef.match(/\([\s\s]*?)\)/)[1];
var fbodyNew=[];
var时间=[];
fbodyNew.push(fbody.shift(),'\n');
对于(变量i=0;休眠&i
最聪明的方法是

function a() {
    // Do stuff
    setTimeout(b, 42)
}

function b() {
    // Do other stuff delayed
}    

永远不要“阻塞”JS中的任何线程-如果您认为必须这样做,那么肯定有一种“更干净”的方法来实现您的目标。

但我不想将第二个函数作为参数传递。之后我有更多的函数,我希望每个函数都延迟。只需将它们全部包装在一个新函数中。@Frodo-wrap all“delayed”在包装器函数中传递给setTimeout的函数。在发布一个示例时说
setTimeout
不起作用,而
setTimeout
绝对适合这个示例似乎有点事与愿违(因此所有的答案都只是告诉您使用它)。也许您应该改进您的问题,以准确显示您需要做什么以及为什么不能使用
setTimeout
?不@AndyE,他不是在说使用
setTimeout
。OP希望暂停执行一段时间而不将执行返回DOM,就像
setTimeout
所做的那样。-1请不要使用此选项,也不要向任何人推荐。JavaScript在浏览器的UI线程上运行,因此在“睡眠”期间无法与网页进行任何交互。在睡眠期间,用户将无法执行任何操作(并且没有其他脚本可以运行)。这是一个贫穷的国家answer@Frodo:如果进行调试,请使用适当的调试工具并设置断点+1虽然我同意像这样旋转绝不是一个好主意,但我不同意对这个答案的反对票,因为这是对所提出问题的答案。使用
setTimeout
会更好,但OP特别要求提供一个不使用它的解决方案。对于非常小且很少延迟的情况(或者,正如OP提到的,调试目的),这个解决方案是可以接受的。虽然我永远不会在我的代码中使用这个解决方案,但它在某种程度上符合这个问题。我想这将是一个一般性的话题。我认为任何花时间回答问题的人都应该受到尊重。除非答案不相关,或者不好+不相关,否则没有必要投反对票。毕竟,我们总是可以选择另一个更好的答案,或者写一个更好的答案+对另一个的评论。我刚刚意识到,我可以用警惕代替睡眠
function parseSleeps(func){
    var fdef = func.toString();

    var fbody = fdef.match(/\{([\s\S]*)\}/)[1].split(/sleep\(.*?\)\;?/);
    var sleeps = fdef.match(/sleep\((.*?)\)/g);
    var fargs = fdef.match(/\(([\s\S]*?)\)/)[1];

    var fbodyNew = [];
    var times = [];
    fbodyNew.push(fbody.shift(), '\n');
    for(var i = 0; sleeps && i < sleeps.length; i++){
        var sec = sleeps[i].match(/\d+/)[0];
        times.push(sec);
        fbodyNew.push('setTimeout(function(){\n');
        fbodyNew.push(fbody.shift(), '\n');
    }

    while(times.length){
        var sec = times.pop();
        fbodyNew.push('}, ', sec, ');\n');
    }

    return new Function(fargs, fbodyNew.join(''));
}

// Your code from here

function a(str1, str2){
    alert(str1);
    sleep(3000);
    alert(str2);
}

var func = parseSleeps(a);
func('here', 'there');
function a() {
    // Do stuff
    setTimeout(b, 42)
}

function b() {
    // Do other stuff delayed
}