2009-02-07 34 views
1

我知道乍一看(由於標題),這看起來像是「在發佈之前您是否嘗試搜索Google?」之一。問題,但我似乎無法找到我遇到的具體問題的答案。對不起,如果我是noob ....仍在學習:)在JavaScript中連續觸發多個隨機超時

我需要模擬JavaScript中的暫停,但setTimeout(function_call,timeout)函數不適用於我。原因在於,當setTimeout函數被調用時,它會異步地進行函數調用。

小背景:
我試圖模擬隨機時間間隔輸入到div的文本。我希望它看起來好像一個人在用戶查看頁面時實際上正在鍵入一條消息。由於超時是一個隨機時間間隔,並且函數調用是異步進行的,因此文本將以隨機順序打印。

這裏是什麼我迄今片段:您的幫助

typeString: function(s) 
{ 
    for(var i=0;i<s.length;i++) 
    {      
     var c = s.charAt(i); 
     var temp = setTimeout("MessageType.typeChar('" + c + "')", this.genRandomTime()); 
    } 
} 



在此先感謝。

CJAM



更新:通過增加計時器延遲到varialbe,它使我能夠偏差逾異步調用。謝謝大家的快速回復。以下是更新的代碼:

typeString: function(s) 
{ 
    var delay = 0; 

    for(var i=0;i<s.length;i++) 
    {      
     var c = s.charAt(i); 
     setTimeout("GoogleTyper.typeChar('"+c+"')", delay += this.genRandomTime()); 
    } 
} 

回答

3

您是否嘗試過累計設置超時?在你的循環之外粘貼一個變量並將其初始化爲0.現在讓我們稱它爲超時。在循環的每次迭代開始時向該變量添加一個隨機數量的時間,並使超時消失。這樣,您就可以確保按順序調用函數。

2

你的問題是你正在使用一個你所有的時間從現在開始延遲 - 下一個計時器需要在之前被解僱。只需將上一個定時器延遲添加到新定時器即可。

typeString: function(s) 
{ 
    var delay = 0; 
    for(var i=0;i<s.length;i++) 
    {      
     var c = s.charAt(i); 
     delay = delay + this.genRandomTime(); 
     var temp = setTimeout("MessageType.typeChar('" + c + "')", delay); 
    } 
} 
+0

我喜歡你的答案,因爲它非常深入,但是我必須把它歸功於Stuart B,因爲他在你之前發佈了它。西方常規賽中速度最快的槍:(希望其他人會喜歡你,併爲你贏得好成績和幫助而贏得一些積分。謝謝你! – regex 2009-02-07 06:53:43

1

不是傳遞到每個定時器事件該字符要顯示,讓每個事件處理程序抓住關閉一個隊列(陣列,列表等等),因此,爲了維持的下一個字符。