最近在做邮件群发的系统,实现起来不难,但是在邮件发送进度和如何减轻邮件发送服务器压力上有点卡住。
开始时是想当然的,直接在后台实现,发一封显示一条对应信息。结果自然是全部发完后一起显示出来了。最后还是采用了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);
}
}
很不错哦,挺好的。
学习了,多谢博主分享了