gpt4 book ai didi

javascript - 通过递归循环同步ajax请求

转载 作者:行者123 更新时间:2023-12-03 07:20:43 25 4
gpt4 key购买 nike

我正在尝试通过向发送邮件的脚本发出 ajax 请求来向许多收件人发送新闻通讯邮件。为了确保前面的请求完成(这样就不会达到浏览器的最大并发请求数),我使用了递归循环函数。

这个问题已经以不同的变体被问过几次,但我找不到任何可以帮助我的答案。

我尝试过的:

var receiverarray = <?php echo json_encode($receiverarray); ?>; // All data is correctly received from PHP
var nrofreceivers = '<?php echo count($receiverarray); ?>';
nrofreceivers = parseInt(nrofreceivers);
function sendmailreceivers(receiverarray, callback) {
try {
var a = 0;
recur_loop(a);
function recur_loop(i) {
var num = i;
if (num < nrofreceivers) {
var count = num + 1;
var percentage = (count / receiverarray.length) * 100;
percentage = Math.round(percentage);
var loadingtext = String(count) + " van " + String(nrofreceivers) + " (" + String(percentage) + "%)";
$('#loadingtext').html(loadingtext);
var thisreceiverarray = receiverarray[num];
$.ajax({
type: "POST",
url: "https://www.domain.com/scripts/sendmail.php", // Script works fine
data: {
'from_mail': '<?php echo $webmastermailaddress; ?>',
'from_name': 'Webmaster name',
'to_mail': thisreceiverarray.email,
'to_name': thisreceiverarray.name,
'reply_name': 'Business name',
'reply_mail': 'Business mail address',
'diff_mailer': '',
'mail_content': '<HTML>The html mail content</HTML>',
'mail_subject': '<?php echo $subject; ?>'
},
success: function(){
recur_loop(count);
},
error: function() {
throw "Error!";
}
});
}
};
callback();
}
catch(err) {
throw "Error!";
}
}

这对于前 3 个邮件地址效果很好。然后,由于未知原因,该函数完成,并且回调确保执行下一个函数(我将用户重定向到感谢页面)。

所以看起来每封邮件都已发送,因为函数完成时没有错误,但实际上只发送了 3 封邮件。

我已经花了很多天寻找答案并试图解决它,但没有运气。控制台没有错误吗?

为什么函数提前结束?

最佳答案

我尝试稍微改进一下你的代码,但它仍然不完美:

var receiverarray = <?php echo json_encode($receiverarray); ?>;

function sendmailreceivers(callback) {
try {
recur_loop(0);
function recur_loop(i) {
if (i === receiverarray.length) {
return callback();
}
var percentage = Math.round((i / receiverarray.length) * 100);
var loadingtext = i + " van " + receiverarray.length + " (" + percentage + "%)";
$('#loadingtext').text(loadingtext);
var thisreceiverarray = receiverarray[i];
$.ajax({
type: "POST",
url: "https://www.domain.com/scripts/sendmail.php", // Script works fine
data: {
'from_mail': '<?php echo $webmastermailaddress; ?>',
'from_name': 'Webmaster name',
'to_mail': thisreceiverarray.email,
'to_name': thisreceiverarray.name,
'reply_name': 'Business name',
'reply_mail': 'Business mail address',
'diff_mailer': '',
'mail_content': '<HTML>The html mail content</HTML>',
'mail_subject': '<?php echo $subject; ?>'
},
success: function(){
recur_loop(i + 1);
},
error: function(err) {
callback(err);
}
});
}
} catch(err) {
callback(err);
}
}

sendmailreceivers(function(err) {
if (err) {
console.error(err.stack);
alert('Error!');
} else {
alert('Done');
}
});

几点说明:

  • 您在第一个请求完成之前调用了回调
  • try { ... } catch(err) { 抛出“错误”; } 将吞下一条有意义的错误消息并将其替换为“Error” - 不是很有用。
  • 如果 str 包含文本而不是 html 代码,最好使用 .text(str) 而不是 .html
  • 通常最好将 err 添加为回调函数的第一个参数,以返回可能的错误。
  • String(val)parseInt(val, 10) 仅用于转换值的类型
  • 与较旧的 PHP 版本不同,您无需在使用变量之前将所有内容存储在变量中。例如,将函数的返回值作为参数传递是完全可以的。

关于javascript - 通过递归循环同步ajax请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36228489/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com