2013-05-08 139 views
-1

我是新來的JavaScript的來自Java,我試圖實現一個sleep(millis)函數。基本上我需要向一個端點發出請求,如果它返回一個錯誤,請稍等一會再發出請求...使用Javascript的睡眠功能

我發現JavaScript的setTimeout()函數,但它有一個奇怪的(對我來說)行爲,因爲它似乎代碼仍然在運行,我不想做任何事情,但稍候...

了一些研究之後,我發現這個功能here

function sleep(milliseconds) { 
    var start = new Date().getTime(); 
    for (var i = 0; i < 1e7; i++) { 
    if ((new Date().getTime() - start) > milliseconds){ 
     break; 
    } 
    } 
} 

隨着這個功能我實現了我想要的,但我知道它可能不是正確的方法,我沒有找到任何其他解決方案所以,我想知道,在你看來,這是:

  • 一個完全有效的解決方案?
  • 一個不錯的解決方法?
  • 對你的眼睛只是痛苦?
+1

我寧願用'setTimeout'安排我跑比吃了CPU資源循環那樣的。 – NilsH 2013-05-08 12:02:15

+1

檢查此問題http://stackoverflow.com/questions/951021/what-do-i-do-if-i-want-a-javascript-version-of-sleep – 999k 2013-05-08 12:03:09

+1

您可以通過適當的方式和JavaScript方式執行此操作。向端點發出ajax請求並獲取響應,像這樣處理它。如果出錯,請給出與'setTimeout'的參數相同的函數。否則使用你的timeoutId來清除'clearTimeout'。 – smitrp 2013-05-08 12:08:37

回答

1

在這段代碼的問題是,直到代碼完成是保持忙碌所有的時間。這可能會在許多瀏覽器中導致警告對話框,並且還會降低頁面的速度。

The dialog

在這裏,我還是寧願使用setTimeout功能。語法很簡單:

setTimeout("codeToBeExecuted()", milliseconds); 

可以通過保存的代碼在一個函數睡覺後,並通過在全局變量所需要的數據或像這樣簡化它:

setTimeout('whenDone(' + numericData + ', "' + stringData + '")', milliseconds); 

JSFiddle

1

你說你不喜歡setTimeout,但基本上,這就是你需要做的。

function myFunc() { 
    // Do the work 
    setTimeout(myFunc, sleepInterval); 
} 

(假設你想創建一個重複的時間表,如果沒有,打電話給你的其他功能,而不是myFunc再次)。

您可以(也可能應該)添加一些終止邏輯。

然後從myFunc()開始你的工作。您也可以使用setInterval,但如果您的間隔開始重疊,則可能會導致一些問題。

關於您的解決方案,我選擇選項3 ...

1

有在Javascript中沒有sleep功能,你應該考慮使用window.setTimeout調用下一步的操作。我當然不會在for循環中燃燒循環。但是,如果您必須將其封裝在一個名爲sleep的函數中,那麼這裏就是一個例子來給你一個想法。

function sleep(callBack, milliSecs) { 
    setTimeout(callBack, milliSecs); 
} 


function first() { 
    console.log("first"); 
} 

function second() { 
    console.log("second"); 
} 

first(); 
sleep(second, 5000); 

jsfiddle