2011-04-13 80 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