这里的所有setTimeout答案都不起作用!
我只想在两个函数之间等待几秒钟,如下所示:
do_fn1();
wait(5000);
do_fn2();
答案 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中的任何线程 - 如果您认为必须这样做,那么肯定是一种“更清洁”的方式来实现您的目标。