我正在尝试发送延迟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 = "<span> " + data + "</span>"
$("#sentTo").append(toAppend);
});
}
服务器端代码(php)获取id并从数据库中选择具有指定id的电子邮件
$query="select email from clienti where id =".$id;
然后发送电子邮件,并发回当前的电子邮件
echo email;
然而,这里出了点问题。似乎js函数等待5秒钟,然后一次显示所有20个电子邮件地址。
你能告诉我我做错了什么吗?任何“睡眠”解决方法将不胜感激:)答案 0 :(得分:3)
使用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)
});
答案 1 :(得分:2)
发生的事情是你将setTimeout再次调用20次,超时为5秒。很自然地,所有电子邮件都会立即发送。您可以将循环更改为如下所示:
for (i=0;i<20;i++) {
setTimeout("SendEmail("+ i + ")",(i+1)*5000);
}
虽然有很多其他选择,但它们最依赖于您的具体问题。
答案 2 :(得分:2)
你应该创建一个在5秒后自行调用的函数
var i=0;
function sendEmailNow() {
SendEmail(i);
++i;
if(i<20) {
setTimeout(sendEmailNow, 5000);
}
}
答案 3 :(得分: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);
}
答案 4 :(得分:1)
你的循环设置20个计时器等待5秒,然后让它们全部进入。
尝试这样的事情:
var email_count = 20;
var sendMails = function(){
SendEmail(email_count--);
if(email_count > 0){
setTimeout(sendMails, 5000);
}
}
setTimeout(sendMails, 5000)
答案 5 :(得分:0)
var i = 0;
(否则泄漏到外部范围或运行时错误)额外关闭:
window.setTimeout(
(function (j) {
return function () {
sendEmail(j);
};
}(i)),
i * 10000);
sendEmail
(代码样式:不是构造函数)$id
以阻止SQL injection。