我尝试用jQuery发送电子邮件,我想通过单击按钮开始和中断发送。
var arr;
function loadArray(table){ arr = table.data;}
function init(){
$('#start').click(function(){
$.each(arr, function( key, value ){
if(value !== null){
var emailTemplate = value['emailTemplate'];
var email = value['email'];
var campaign = value['campaign'];
sendAnEmail(emailTemplate, email, campaign, key);
arr[key] = null;
}
console.log(arr);
$(this).click(function(){
return false;
});
});
});
}
function sendAnEmail(template, email, campaign, num){
$.ajax({
type: "POST",
dataType: "json",
async: false,
data: { template: template, email: email, num: num, campaign: campaign },
url: Routing.generate('wyslij_email'),
success: function(msg){
if(msg.status == 'success'){
var count = parseInt($('.sended').text());
$('.sended').text(count+1);
}else{
var count = parseInt($('.error').text());
$('.error').text(count+1);
}
}
});
}
我创建了一个简单的init函数,它运行良好。单击#启动后,它将启动每个功能。当每个功能循环时,我都无法点击任何按钮。
我认为AJAX通过async=false来阻止它;这是真的吗?
我的问题很简单。为什么它不起作用?
不要使用async: false
,因为它会阻塞脚本!
如果你需要它们一个接一个地发送,你可以用循环建立一个堆栈,然后一个接地发送(例如…):
//outside function context (global variable)
var stack = [];
//in loop, instead of calling the function
stack.push({template: template, email: email, num: num, campaign: campaign});
//after loop:
stack.reverse(); //if you need them to be in the order they got created....if not, just erase this line
sendData();
function sendData(){
if(stack.length > 0){
$.ajax({
type: "POST",
dataType: "json",
data:stack.pop(), //get next entry
async:true, //or delete this line, since true is default
url: Routing.generate('wyslij_email'),
success:function(msg){
if(msg.status == 'success'){
var count = parseInt($('.sended').text());
$('.sended').text(count+1);
sendData(); //recurse to next stack item
} else {
var count = parseInt($('.error').text());
$('.error').text(count+1);
}
}
});
}
}