关于javascript中的睡眠:在javascript中睡眠 – 没有setTimeout

Sleep in javascript - no setTimeout

本问题已经有最佳答案,请猛点这里访问。

所有这些设定的答案都不起作用!

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

1
2
3
4
5
do_fn1();

wait(5000);

do_fn2();


来自phpied.com:

1
2
3
4
5
6
7
8
function sleep(milliseconds) {
  var start = new Date().getTime();
  for (var i = 0; i < 1e7; i++) {
    if ((new Date().getTime() - start) > milliseconds){
      break;
    }
  }
}


两个想法:

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

1
2
3
4
5
 var postDelayFunc = function(){
   dosomething();
   dosomethingelse();
   onemorething();
 }

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

1
2
3
 //your code
 dofunc1();
 setTimeout(postDelayFunc, 1000);

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

但有一件事令我震惊,那就是你对其他答案的反应,以及可能是在哪里产生了困惑。我认为您正在查看您的函数,并看到一个线程,您只是想在继续之前保持一段时间。

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

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


我觉得你做不到。你可能不得不

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


最聪明的方法是

1
2
3
4
5
6
7
8
function a() {
    // Do stuff
    setTimeout(b, 42)
}

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

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


另一个我可能会使用的黑客,但我个人并不推荐。请访问http://jsfiddle.net/s6ks8/1/

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
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(), '
'
);
    for(var i = 0; sleeps && i < sleeps.length; i++){
        var sec = sleeps[i].match(/\d+/)[0];
        times.push(sec);
        fbodyNew.push('setTimeout(function(){
'
);
        fbodyNew.push(fbody.shift(), '
'
);
    }

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

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

All those setTimeout answers here don't work!

当然有:

1
2
3
4
5
6
7
8
9
10
function a() {
  alert("I'm pretty sure...");
}

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

a();
setTimeout(b, 5000);


说他们没有一个例子就不工作是很重要的,因为我相信他们可能会这样做。

这个怎么样?

1
2
do_fn1();
setTimeout(do_fn2, 5000);