2009-08-14 90 views
5

我想要這樣的JavaScript的東西。有沒有相當於Javascript或Jquery的睡眠功能?

for (i = 0; i < 10; i++) { 
    alert(i); 
    // now sleep 1 sec 
    sleep(1000); 
} 

有一個內置的Javascript或jQuery的這個?

謝謝!

+0

發佈之前,我會做的第一件事是http://stackoverflow.com/search?q=[JavaScript ] +睡眠,你可以看到已經有很多解決方案 – epascarello 2009-08-14 12:49:02

+0

接下來的事情是想知道爲什麼你需要睡眠,而不是像Zoidberg所說的基於事件的解決方案。 – xtofl 2009-08-14 15:09:17

回答

5

有沒有這樣的事情,直接。您將不得不告訴JavaScript在一段時間後使用setTimeout來喚醒「某事」。

這個'東西'應該是你打算在睡眠後執行的代碼。

從一個例子,我在the internet發現:

function dothingswithsleep(part) { 
    if(part == 0) { 
     alert("before sleep"); 
     setTimeout(function() { dothingswithsleep(1); }, 1000); 
    } else if(part == 1) { 
     alert("after sleep"); 
    } 
} 

但這脆弱的設計。你最好重新考慮一下你的業務邏輯在第二步之後做些什麼:調用一個不同的函數,而不是使用這些人爲的幫助變量。

5

使用

setTimeout

方法

+0

只有setTimeout需要一個繼續函數作爲參數。 – xtofl 2009-08-14 10:18:48

+0

我試過使用setTimeout,但我不需要延續功能。 – 2009-08-14 11:24:39

+0

延續是強制性的,如果你想PHP的行爲。 setTimeout(runThisFunc(),after1sec) - 與php不同,js不會等待一行完成,直到下一個被執行。 – Devrim 2011-01-27 15:47:38

2

第一個問題,爲什麼你想睡在一個循環內?如果這是必需的,可能應該安裝一個事件系統。我自己已經多次嘗試使用多線程JavaScript編程的睡眠策略,並發現它不能很好地工作。在javascript中執行多線程的最好方法是使用YUI或幾乎任何其他框架提供的事件系統。讓聽衆訂閱此事件,並在發生時執行一些操作。在這些事件框架中,您可以完全控制自己的自定義事件何時觸發,所以它們沒有什麼大不了的。

以下是YUI事件框架的鏈接。

http://developer.yahoo.com/yui/examples/event/index.html

下面是它如何使用YUI

var myEvent = new YAHOO.util.CustomEvent('fooEvent'); 
// subscribe a function to be called (first param) inside the scope of an object 
// (second param). 
myEvent.subscribe(function() {alert(this.count++);},{count:0},true); 
setTimeout('myEvent.fire()',1000); 

做的這種方式進行編碼是更清潔和更緊湊。或者如果您不想使用事件框架,請嘗試此操作

var myObj = { 
    count:0, 
    doSomething:function(){alert(this.count++);} 
    loopFunc:function(){ 
     this.doSomething(); 
     setTimeout('myObj.loopFunc()',1000); 
    } 
} 

這提供了您所需要的,它更緊湊。

但是,如果您確實必須在您的代碼中具有睡眠功能,那麼我會建議對簡單的服務器端腳本進行同步ajax調用。然後,如果您願意,可以使用服務器上的代碼進行睡眠。以下是此處發佈的問題的鏈接,向您展示如何進行同步呼叫。

How can I get jQuery to perform a synchronous, rather than asynchronous, Ajax request?

但我強烈建議你去的setTimeout的方式。更清潔,如果可以避免,您可能不想撥打任何服務器端電話。

+0

我一直在用JS進行回調,我學到的一件事就是你的loopFunc將被調用'this'而不是你的'myObj'。你需要將所需的'this'存儲在關閉中。 – xtofl 2009-08-14 15:09:53

+0

除此之外,您基於事件的建議值得很多! – xtofl 2009-08-14 15:10:33

+0

第二個例子應該能夠在myObj範圍內執行loopFunc。所以這應該引用myObj,我不喜歡的唯一問題是myObj必須是setTimeout執行的全局可用變量才能找到它。 你能解釋一下你是什麼意思嗎?「這在關閉」? – Zoidberg 2009-08-14 15:33:49

2

我已經搜索/搜索了一些關於javascript sleep/wait的網頁...如果你想javascript運行,延遲,運行......沒有答案......大多數人所得到的是「RUN,RUN(無用的東西),RUN」或「RUN,RUN +延遲RUN」...... 。

所以我吃了漢堡,有思想::: 這裏是一個可行的解決方案......但你要砍你的運行代碼... :::

// ... ...................................... // example1:

<html> 
<body> 
<div id="id1">DISPLAY</div> 

<script> 
//javascript sleep by "therealdealsince1982"; copyrighted 2009 
//setInterval 
var i = 0; 

function run() { 
    //pieces of codes to run 
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; } 
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; } 
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; } 
    if (i >2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" is ran</p>"; } 
    if (i==5){document.getElementById("id1").innerHTML= "<p>all code segment finished running</p>"; clearInterval(t); } //end interval, stops run 
    i++; //segment of code finished running, next... 
} 

t=setInterval("run()",1000); 

</script> 
</body> 
</html> 

// .................................... // example2:

<html> 
<body> 
<div id="id1">DISPLAY</div> 

<script> 
//javascript sleep by "therealdealsince1982"; copyrighted 2009 
//setTimeout 
var i = 0; 

function run() { 
    //pieces of codes to run, can use switch statement 
    if (i==0){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(1000);} 
    if (i==1){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(2000);} 
    if (i==2){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>"; sleep(3000);} 
    if (i==3){document.getElementById("id1").innerHTML= "<p>code segment "+ i +" ran</p>";} //stops automatically 
    i++; 
} 

function sleep(dur) {t=setTimeout("run()",dur);} //starts flow control again after dur 

run(); //starts flow 
</script> 
</body> 
</html> 
0
function sleep(delay) { 
    var start = new Date().getTime(); 
    while (new Date().getTime() < start + delay); 
} 
+4

標準CPU刻錄機 – 2010-10-30 19:01:41

+2

正確;不要這樣做。 – sosiouxme 2012-02-02 16:49:18

+0

這是怎麼回事? – aaronbauman 2014-01-24 16:16:41

0

好吧,如果你有安裝在Web服務器上的PHP,你可以使用$.load或類似的呼籲,只有在它sleep(int)一個PHP文件...

1

我看到這個評論:「我已經嘗試過使用setTimeout,但我不需要延續功能「,並且認爲,是的,你確實需要。你不需要的是一個循環。你需要一個遞歸函數。

for (i = 0; i < 10; i++) { 
    alert(i); 
    // now sleep 1 sec 
    sleep(1000); 
} 

轉化爲這

function recursive(i, max) 
{ 
    if (i > max) return; 
    alert(i); 
    i = i + 1; 
    setTimeout(function(){ recursive(i, max); }, 1000); 
} 

recursive(1, 10); 

例子:http://jsfiddle.net/q76Qa/