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)
- 避免使用jQuery。 学习JavaScript。
-
var i = 0;
(否则泄漏到外部范围或运行时错误) -
额外关闭:
window.setTimeout( (function (j) { return function () { sendEmail(j); }; }(i)), i * 10000);
-
sendEmail
(代码样式:不是构造函数) - 你真的想在服务器端代码中转义
$id
以防止SQL注入 。