使用javascript 实现类sleep()效果的两种实现方法

最近在做邮件群发的系统,实现起来不难,但是在邮件发送进度和如何减轻邮件发送服务器压力上有点卡住。
开始时是想当然的,直接在后台实现,发一封显示一条对应信息。结果自然是全部发完后一起显示出来了。最后还是采用了Ajax的异步处理,提交到另一个页面,让服务端来处理,处理完后反馈一条发送信息。而客户端则在等到反馈的信息后再处理下一封邮件:
代码如下:
[codes=JS]
$.ajax({
    url: ‘/WebServices/SendEmail.aspx’,
    data: ‘uname=’ + uname + ‘&email=’ + email,
    async: false,
    success: function (data) {
        var msg = data + ‘
‘ + $(‘#showmsg’).html();
        $(‘#showmsg’).html(msg);
    }
});

但是怎么减轻服务端的发送压力呢?想法是以指定的时间频率来发送邮件,比如30秒一封邮件。然后在发送了一定数量的邮件后多休息一些时间,如每发送100封邮件,间隔5分钟再开始下一轮发送。

其实如果要实现第一条还是比较容易的,如代码示例:
[codes=JS]
var dotCounter = 0;
var intId = setInterval(addDot,1000);
function addDot(){
    if (dotCounter < 10) {
        dotCounter++;
        $(‘#msg’).html(dotCounter);
    } else {
        clearInterval(intId);  
    }
}

然而要实现第2点则有些困难了。今天上jQuery论坛搜索了一下,发现了如下代码:
[codes=JS]
var dotCounter = 0;
(function addDot() {
  setTimeout(function() {
    if (dotCounter++ < 10) {
      $(‘#dots’).append(‘.’);
      addDot();
    }
  }, 1000);
})();

然后自己改造一下,终于给达到自己想的效果了:
[codes=JS]
var dotCounter = 0;
var time=1000;
(function addDot() {
  setTimeout(function() {
    if (dotCounter++ <= 50) {
      $(‘#msg’).html(dotCounter);
      addDot();
    }
    
    if(dotCounter %10 == 0){
      time= 1000*5;
    }else{
      time=1000;
    }
  }, time);
})();

从效果上看达到了,然后代码的可读性确实差了一些,偶想有一个类似C下面的Sleep,如同下面代码一下,那样多好啊!


for(int i=0;i<100;;){
  //dosomething.....
  if(i % 10 ==0){
    sleep(1000);
  }
}

“使用javascript 实现类sleep()效果的两种实现方法”的2个回复

发表评论