javascript与SetTimeout一起睡觉

时间:2011-12-24 12:07:16

标签: javascript jquery ajax 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 = "<span>     " + data + "</span>"
        $("#sentTo").append(toAppend);
    });
}

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

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

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

echo email;

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

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

6 个答案:

答案 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)

  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