2011-12-24 49 views
1

我試圖發送電子郵件之間10秒的延遲。我寫了這個代碼:與SetTimeout的JavaScript睡眠

$(document).ready(function() { 
    for (i = 0; i < 20; i++) { 
     setTimeout("SendEmail(" + i + ")", 5000); 
    } 
}); 

function SendEmail(id) { 
    $.get("mimesender.php?id=" + id, function(data) { 
     var toAppend = "<span>  " + data + "</span>" 
     $("#sentTo").append(toAppend); 
    }); 
} 

服務器端代碼(PHP)獲取ID並從數據庫中

$query="select email from clienti where id =".$id; 

然後發送電子郵件選擇與指定ID的郵件,併發送回當前的電子郵件

echo email; 

但是,這裏有些問題。看起來js函數等待5秒鐘,然後一次顯示所有20個電子郵件地址。

你能告訴我我做錯了什麼嗎?任何「睡眠」的解決方法將不勝感激:)

+1

只是因爲你的for循環不等待5秒。 –

+0

所有'setTimeout's基本上同時被調用。 –

回答

2

你應該創造出5秒

var i=0; 

function sendEmailNow() { 
    SendEmail(i); 
    ++i; 
    if(i<20) { 
     setTimeout(sendEmailNow, 5000); 
    } 
} 
+0

that workds,謝謝 –

+0

避免全局變量。這可以不用。 – PointedEars

+0

@PointedEars是的,它可以完成。我也同意全局變量是邪惡的,但這是JavaScript應用程序或使用大量JS代碼的網頁中的問題。這裏我沒有傳遞函數結構(以避免全局變量),只是爲了使它更具可讀性(這也是期望的)。 – Pradeep

2

會發生什麼事情是,你調用setTimeout 20次,緊接着另一個,超時5秒。自然,所有電子郵件都會一次發送。你可以改變循環看起來像這樣:

for (i=0;i<20;i++) { 
    setTimeout("SendEmail("+ i + ")",(i+1)*5000); 
} 

還有很多其他選擇,雖然,他們會取決於正是最適合您的具體問題。

2

後首先調用自身的函數,傳遞函數setTimeout

其次,如果在當前隊列完成後爲隊列中的下一個隊列設置超時值,那麼效果會更好。

for循環:

sendEmail(0); // start sending first 

,並在回調:

 , function(data) { 
      if(id < 19) { // if next should be sent 
       setTimeout(function() { 
        SendEmail(id + 1); 
       }, 5000); 
      } 
      var toAppend = "<span>  " + data + "</span>" 
      $("#sentTo").append(toAppend); 
     } 
1

你的循環是建立20個計時器等待5秒鐘,然後讓他們都去一次。

嘗試這樣:

var email_count = 20; 

var sendMails = function(){ 
    SendEmail(email_count--); 
    if(email_count > 0){ 
     setTimeout(sendMails, 5000); 
    } 
} 

setTimeout(sendMails, 5000) 
3

使用間隔,而不是循環。

工作演示:http://jsfiddle.net/xfVa9/2/

$(document).ready(function() { 
    var tmr; 
    var i=0; 
    tmr=setInterval(function(){ 
     if(i<20){ 
      SendEmail(i); 
      alert("Sent "+i) 
      i++; 
     }else{ 
      clearInterval(tmr); 
     } 

    },5000) 

}); 
+0

使用'setInterval'的+1。但請注意,「i」正被宣佈爲全局變量。這裏有一個改進的例子:http://jsfiddle.net/xfVa9/3/ – PPvG

+0

謝謝,編輯:) – Usman

0
  1. 避免jQuery的。學習JavaScript。
  2. var i = 0;(否則泄漏到外部範圍或運行時錯誤)
  3. 額外關閉:

    window.setTimeout(
        (function (j) { 
        return function() { 
         sendEmail(j); 
        }; 
        }(i)), 
        i * 10000); 
    
  4. sendEmail(代碼風格:不是構造)
  5. 你真的想在服務器到逃生$id防止代碼爲SQL injection