在javascript中睡觉 - 没有setTimeout

时间:2011-06-26 13:45:20

标签: javascript

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

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

do_fn1();

wait(5000);

do_fn2();

7 个答案:

答案 0 :(得分:9)

来自phpied.com

function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}

答案 1 :(得分:2)

我认为你不能。你可能需要

do_fn1();
window.setTimeout(do_fn2, 5000);

答案 2 :(得分:2)

两个想法:

首先,为什么不将所有后延迟语句都包装成包装函数

 var postDelayFunc = function(){
   dosomething();
   dosomethingelse();
   onemorething();
 }

然后在你的代码中将此函数作为setTimeout的参数传递。

 //your code
 dofunc1();
 setTimeout(postDelayFunc, 1000);

或者看看jQuery deferred:http://msdn.microsoft.com/en-us/scriptjunkie/gg723713,尽管你最终可能会编写非常相似的代码。

关于你对其他答案的反应以及可能出现混乱的地方,有一件事令我震惊。我认为你正在看你的功能,看到你想要暂停一段时间的单个线程,然后继续。

你不应该在javascript中这样做,因为它会占用整个浏览器并且会让用户感到厌烦。相反,当你使用setTimeout时你正在做的事情表明,当超时到期时,另一个线程将接收并执行传入的函数。

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

答案 3 :(得分:0)

如果没有一个例子,他们都无法工作是一个很大的问题,因为我确信他们可能会这样做。

这个怎么样,

do_fn1();
setTimeout(do_fn2, 5000);

答案 4 :(得分:0)

  

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

当然他们这样做:

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

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

a();
setTimeout(b, 5000);

答案 5 :(得分:0)

我可能会使用另一个黑客,不过我个人不推荐它 点击此处http://jsfiddle.net/S6Ks8/1/

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');

答案 6 :(得分:0)

最聪明的方法是拥有像

这样的东西
function a() {
    // Do stuff
    setTimeout(b, 42)
}

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

永远不要“阻止​​”JS中的任何线程 - 如果您认为必须这样做,那么肯定是一种“更清洁”的方式来实现您的目标。