javascript与SetTimeout一起睡觉

我正在尝试发送延迟10秒的电子邮件。 我写了这段代码:

$(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 = " " + data + "" $("#sentTo").append(toAppend); }); } 

服务器端代码(php)获取id并从数据库中选择具有指定id的电子邮件

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

然后发送电子邮件,并发回当前的电子邮件

 echo email; 

但是,这里出了点问题。 似乎js函数等待5秒,然后一次显示所有20个电子邮件地址。

你能告诉我我做错了什么吗? 任何“睡眠”解决方法将不胜感激:)

您应该创建一个在5秒后调用自身的函数

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

使用interval而不是loop。

工作演示: 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) }); 

发生的事情是你调用setTimeout 20次,一次又一次,超时为5秒。 很自然地,所有电子邮件都会立即发送。 您可以将循环更改为如下所示:

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

虽然有很多其他选择,但它们取决于最适合您特定问题的选择。

首先,将函数传递给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 = " " + data + "" $("#sentTo").append(toAppend); } 

你的循环设置20个计时器等待5秒,然后让它们全部进入。

尝试这样的事情:

 var email_count = 20; var sendMails = function(){ SendEmail(email_count--); if(email_count > 0){ setTimeout(sendMails, 5000); } } setTimeout(sendMails, 5000) 
  1. 避免使用jQuery。 学习JavaScript。
  2. var i = 0; (否则泄漏到外部范围或运行时错误)
  3. 额外关闭:

     window.setTimeout( (function (j) { return function () { sendEmail(j); }; }(i)), i * 10000); 
  4. sendEmail (代码样式:不是构造函数)
  5. 你真的想在服务器端代码中转义$id以防止SQL注入 。