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