在javascript中睡觉-没有setTimeout [重复]

Posted

技术标签:

【中文标题】在javascript中睡觉-没有setTimeout [重复]【英文标题】:Sleep in javascript - no setTimeout [duplicate] 【发布时间】:2011-09-22 23:34:05 【问题描述】:

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

我只想在两个函数之间等待几秒钟,像这样:

do_fn1();

wait(5000);

do_fn2();

【问题讨论】:

setTimeout 不起作用,同时发布一个setTimeout 绝对完美的例子似乎有些适得其反(因此所有答案都只是告诉你使用它)。也许您应该改进您的问题,以准确显示您需要做什么以及为什么不能使用 setTimeout 完成它? 不@AndyE,他不是在谈论使用setTimeout。 OP 希望暂停执行一段时间,而不像 setTimeout 那样将执行交还给 DOM。 【参考方案1】:

来自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 请不要使用它或将它推荐给任何人。 javascript 在浏览器的 UI 线程上运行,因此在“休眠”时与网页进行任何交互都是不可能的。 在该睡眠期间,用户将无法执行任何操作(并且没有其他脚本能够运行)。这是一个糟糕的答案 @Frodo:如果您进行调试,请使用适当的调试工具并设置断点 +1 虽然我同意像这样旋转几乎不是一个好主意,但我不同意对这个答案的反对意见,因为这 所提出问题的答案.使用 setTimeout 会好很多,但 OP 特别要求提供不使用它的解决方案。对于非常小的和很少的延迟(或者,正如 OP 提到的,调试目的),这个解决方案是可以接受的。 首先,+1 对 leon 的回答。尽管我永远不会在我的代码中使用该解决方案,但它在某种程度上符合这个问题。我想这将是一个普遍的话题。我认为任何花时间回答问题的人都应该受到尊重。除非答案无关紧要,或者不好+无关紧要,否则不需要投票。毕竟,我们总是可以为另一个更好的答案投票,或者写一个更好的答案 + 对另一个答案发表评论。【参考方案2】:

我不认为你可以。你可能不得不

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

【讨论】:

但我不想将第二个函数作为参数传递。之后我有更多功能,我希望每个功能都延迟.. 只需将它们全部包装在一个新函数中。 @Frodo - 将所有“延迟”函数包装在一个包装函数中以传递给 setTimeout。【参考方案3】:

两个想法:

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

 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 时,您实际上所做的是表明当超时到期时,另一个线程将拾取并执行传入的函数。

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

【讨论】:

【参考方案4】:

说没有例子他们都不能工作是很大的呼吁,因为我相信他们可能这样做。

这个怎么样,

do_fn1();
setTimeout(do_fn2, 5000);

【讨论】:

【参考方案5】:

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

他们当然会这样做:

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


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


a();
setTimeout(b, 5000);

【讨论】:

我刚刚意识到,我可以使用警报代替睡眠【参考方案6】:

我可能会使用另一个 hack,但我个人不推荐它。 在这里查看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');

【讨论】:

【参考方案7】:

最聪明的方法是拥有类似的东西

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


function b() 
    // Do other stuff delayed
    

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

【讨论】:

以上是关于在javascript中睡觉-没有setTimeout [重复]的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript Javascript - 睡觉

javascript 睡觉无极

javascript 睡觉

javascript 睡觉

javascript 睡觉

JavaScript 对象的原型扩展(JS面向对象中的继承)