2011-04-13 81 views
2

我知道这是不好:需要JavaScript的睡眠()的替代

function sleep(millis) { 
    var date = new Date(); 
    var curDate = null; 
    do { curDate = new Date(); 
    } while(curDate-date < millis); 
} 

EDIT: 
function doSomethingQuickly(pixelData) { 
    // loads an external image, filling the entire screen 
    // overlays $pixelsData over image 
} 

但我真的需要这种功能,因为doSomethingQuickly()返回如此之快,另doSomethingQuickly()'s不能被允许运行直到前一个完成。简单地解雇他们并等待结果处理他们将是灾难性的。

doSomethingQuicky(); 
sleep(500); 
doSomethingQuicky(); 
sleep(500); 
doSomethingQuicky(); 
sleep(500); 
doSomethingQuicky(); 
sleep(500); 
doSomethingQuicky(); 
sleep(500); 

我的问题是,由于在JS模拟睡眠不好,我怎么能实现使用的setTimeout()基本相同或另一种更可接受的方法

注:这是不是在网络浏览器

编辑: 你可以看到,如果它运行5次没有睡眠,它会很快显示最终图像,当它应该做的是1)显示图像2)暂停5秒3)重复你可以看到如果它在没有睡眠的情况下跑5次,它会很快显示最终的图像,当它是什么应该做的是1)显示图像2)暂停5秒3)重复

+0

如何是你的函数返回的如此之快,它没有足够的时间来完成? – 2011-04-13 14:49:13

+0

错误,请使用setTimeout()?你自己回答你自己的问题。还是我错过了那么深刻,如此深刻以至于几乎是神秘的东西? – 2011-04-13 14:49:23

+0

哈哈@peter在这里没有什么神秘的,看到上面的编辑:上面的评论。如果你认为使用setTimeout()不会很快消除前4个图像,只显示最后一个,那么我很满意。像素数据是动态数据 - 我希望这将与这个 – 2011-04-13 15:12:05

回答

3

JavaScript是单线程的。任何系列的doSomethingQuicky();都应该顺序执行。

这就是除非你在doSomethingQuicky();内使用一些定时器功能。不知道这个功能是干什么的,很难提供建议。

+0

我加了doSomethingQuickly()。你可以看到,如果它在没有睡眠的情况下运行5次,它会很快显示最终的图像,当它应该做的是1)显示图像2)暂停5秒3)重复 – 2011-04-13 15:06:39

+0

如果图像从服务器,JavaScript不知道需要多长时间。您需要在图像上放置一个“onload”处理函数,然后调用该事件的下一个加载函数。 – 2011-04-13 15:14:00

+0

我必须在图片加载之间暂停5秒,无论加载需要多长时间(即使它无法完全加载) – 2011-04-13 15:16:57

3
var interval = setInterval(doSomethingQuickly, 500) 

... 

clearInterval(interval); 

我不知道代码在做什么。 JavaScript是单线程的,所以你不应该遇到任何问题。你也不应该睡觉,因为它睡觉的唯一线程。

4

如何:

function sleep(ms,callback){ 
    setTimeout(callback,ms); 
} 
//basic usage 
while (someStoppingcondition){ 
    sleep(500,doSomethingQuicky); 
} 

如果doSomethingQuicky总是相同的功能,setInterval(见其他答案)就足够了。确保它不会永远运行,使用clear[Interval/Timeout]来停止定时器。

,如果你的问题是,一个函数来完成下一个执行之前,这可能是解决这个问题的方式:

function firstRunner(arg1,arg2,/* ... argx*/, nextRunner){ 
    //do things 
    //after things are done, run nextRunner 
    nextRunner(); 
} 
+0

谢谢,这很有趣 – 2011-04-13 15:57:05

+0

为什么你需要睡眠?只需使用'setTimeout' – 2012-03-30 16:35:53