js等待ajax执行完,js等待方法执行完再执行

这段代码展示了如何处理批量发送邮件的问题,特别是在使用for循环和ajax时遇到的异步问题。通过调整代码,采用逐个发送并递归调用自身的方法,解决了因ajax异步导致的发送顺序混乱和浏览器阻塞问题。邮件发送状态(成功、失败)会在表格中实时更新。
摘要由CSDN通过智能技术生成

b131ca0458defae3e1e8b975665d5c9c.png

您好

哈哈,我刚解决了一个这样的问题如果直接for然后ajax,肯定是不行的因为ajax是异步调用,for循环都循环完了,ajax说不定才执行了第一个调用当然用同步调用的方式可以解决,但同步会阻塞浏览器,时间长的话,像死机一样的效果下面,给你我的解决方法,同步和异步的,我使用的后面一种(调用jQuery库后)/*

//开始群发此方法因为会阻塞浏览器,在帐号较多的情况下,使浏览器出现“假死”现象,所以放弃

function Send() {

var email, userName;

var magazineId = $("#magazineId").val();

var objTable = $(".zebraTable").find("tr");

var usersCount = objTable.length - 2;//获取帐号数,去除表头和表尾各占的一行

var mailColumn = 1;//email所在列的索

objTable.each(function(i) {

if(i > 0 && i <= usersCount) {

email = $(this).find("td").eq(1).text();

userName = $(this).find("td").eq(2).text();

//alert(email);

$.ajax({

type: "POST",

url: "Send.asp",

data: "Email=" + email + "&UserName=" + userName + "&MagazineId=" + magazineId,

async: false,

timeout: 300000,

success: function(msg) {

if(msg == 1) {

SendSuccess(i);

} else {

SendFailure(i);

}

},

error: function() {SendFairlure(i);}

});

} else if(i == usersCount + 1) {

$(this).find("input").attr("disabled", "")

}

});

}

*/答案补充

//开始群发

function Send(i) {

var email, userName;

var magazineId = $("#magazineId").val();

var objTable = $(".zebraTable");

var usersCount = objTable.find("tr").length - 2;//获取帐号数,去除表头和表尾各占的一行

var mailColumn = 1;//email所在列的索

if(i == null) {

i = 1;

}答案补充

if(i > 0 && i <= usersCount) {

Sending(i);

email = $(objTable).find("tr").eq(i).find("td").eq(1).text();

userName = $(objTable).find("tr").eq(i).find("td").eq(2).text();

$.ajax({

type: "POST",

url: "Send.asp",

data: "Email=" + email + "&UserName=" + userName + "&MagazineId=" + magazineId,

timeout: 120000,//邮件发送超时设置,单位:毫答案补充

success: function(msg) {

if(msg == 1) {

SendSuccess(i);

} else {

SendFailure(i);

}

},

error: function() {SendFairlure(i);},

complete: function() {

i += 1;

Send(i);//发送完成以后,调用自身函数发下一封

}

});

}

if(i == usersCount + 1) {

$(objTable).find("tr").find("input").attr("disabled", "")

}

}答案补充

//邮件发送中

function Sending(i) {

var objTd = $(".zebraTable").find("tr").eq(i).find("td");

objTd.eq(5).html("<span class='yellow'>发送中...</span>");

objTd.eq(6).html("<img src='Images/Space.gif' alt='正在发送' class='sending' />");

}//邮件发送成功

function SendSuccess(i) {

var objTd = $(".zebraTable").find("tr").eq(i).find("td");

objTd.eq(5).html("<span class='green'>成功</span>");

objTd.eq(6).html("<img src='Images/Space.gif' alt='发送成功' class='success' />");

}答案补充

//邮件发送失败

function SendFailure(i) {

var objTd = $(".zebraTable").find("tr").eq(i).find("td");

objTd.eq(5).html("<span class='red'>失败</span>");

objTd.eq(6).html("<img src='Images/Space.gif' alt='发送失败' class='failure' />");

}//邮件发送超时,暂未启用此功能,当前超时以失败处理

function SendTimeout(i) {

var objTd = $(".zebraTable").find("tr").eq(i).find("td");

objTd.eq(5).html("<span class='purple'>超时</span>");

objTd.eq(6).html("<img src='Images/Space.gif' alt='发送超时' class='timeout' />");

}答案补充

效果示例图片

哈哈,我刚解决了一个这样的问题如果直接for然后ajax,肯定是不行的因为ajax是异步调用,for循环都循环完了,ajax说不定才执行了第一个调用当然用同步调用的方式可以解决,但同步会阻塞浏览器,时间长的话,像死机一样的效果下面,给你我的解决方法,同步和异步的,我使用的后面一种(调用jQuery库后)/*</p><p>//开始群发此方法因为会阻塞浏览器,在帐号较多的情况下,使浏览器出现“假死”现象,所以放弃</p><p>function Send() {</p><p>var email, userName;</p><p>var magazineId = $("#magazineId").val();</p><p>var objTable = $(".zebraTable").find("tr");</p><p>var usersCount = objTable.length - 2;//获取帐号数,去除表头和表尾各占的一行</p><p>var mailColumn = 1;//email所在列的索</p><p>objTable.each(function(i) {</p><p>if(i > 0 && i <= usersCount) {</p><p>email = $(this).find("td").eq(1).text();</p><p>userName = $(this).find("td").eq(2).text();</p><p>//alert(email);</p><p>$.ajax({</p><p>type: "POST",</p><p>url: "Send.asp",</p><p>data: "Email=" + email + "&UserName=" + userName + "&MagazineId=" + magazineId,</p><p>async: false,</p><p>timeout: 300000,</p><p>success: function(msg) {</p><p>if(msg == 1) {</p><p>SendSuccess(i);</p><p>} else {</p><p>SendFailure(i);</p><p>}</p><p>},</p><p>error: function() {SendFairlure(i);}</p><p>});</p><p>} else if(i == usersCount + 1) {</p><p>$(this).find("input").attr("disabled", "")</p><p>}</p><p>});</p><p>}</p><p>*/

◆◆

评论读取中....

请登录后再发表评论!

◆◆

修改失败,请稍后尝试

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值