setTimeout 在循环中只运行一次
setTimeout only runs once in loop
我的目标是每X秒执行一次javascript函数。我已经读过应该使用 setInterval,但我不相信我的情况。我也不希望必须重新发送变量,以防用户决定在正式发送所有内容之前更改内容
例如,我及时输入 60 条,在数量上输入 5 条,但它等待了 60 秒,然后只发送了 5 条,每 1 秒发送 60 条短信,直到它发送了 5 条短信
我的JavaScript
$('input[name="sendtxt"]').click(function(e) {
sendText(e);
});
function sendText(e) {
e.preventDefault();
var phonenum = $('input[name="phonenum"]').val();
var provider = $('select[name="provider"]').val();
var message = $('textarea[name="message"]').val();
var otherprov = $('input[name="otherprov"]').val();
var amount = $('input[name="amount"]').val();
var time = $('input[name="time"]').val() * 1000;
var sendmsg;
for (sendmsg = 1; sendmsg <= amount; sendmsg++) {
setTimeout(function() {
$.ajax({
type: 'POST',
data: {
provider: provider,
message: message,
phonenum: phonenum,
amount: amount,
otherprov: otherprov,
time: time
},
url: 'send.php',
success: function(data) {
console.log('Success. Sent ' + sendmsg + " texts.");
},
error: function(xhr, err) {
console.log("readyState: " + xhr.readyState + "'nstatus: " + xhr.status);
console.log("responseText: " + xhr.responseText);
}
});
}, time);
}
和我的 PHP
<?php
$to = $_POST["phonenum"];
$provider = $_POST["provider"];
$otherprov = $_POST["otherprov"];
$fixedotherprov = str_replace("otherprovider", "", $otherprov);
$completenum = $to . $provider . $fixedotherprov;
$completenum = str_replace('otherprovider', '', $completenum);
$subject = 'Hello';
$message = $_POST["message"];
$headers = 'From: Daniel';
$amount = $_POST["amount"];
//for ($x = 0; $x < $amount; $x++) {
mail($completenum, $subject, $message, $headers);
//}
?>
setTimeout
是一个异步函数。超时事件在从 sendmsg = 1
到 sendmsg <= amount
的循环中定义。执行 for 循环后,将执行 for 循环下的其余代码,直到触发超时事件。触发超时事件时,sendmsg
的值等于 amount+1
,因为循环已经完成执行。因此,所有超时事件都会获得sendmsg
的值,因为amout+1
导致意外行为。
在下面的代码中,在每次迭代时定义了一个临时范围,该范围为每个timeout
事件提供不同的sendmsg
值。
您还必须在每次迭代中安排不同的时间作为超时时间值,以便在不同的超时中执行它们。
像这样修改你的代码。
function sendText(e) {
e.preventDefault();
var phonenum = $('input[name="phonenum"]').val();
var provider = $('select[name="provider"]').val();
var message = $('textarea[name="message"]').val();
var otherprov = $('input[name="otherprov"]').val();
var amount = $('input[name="amount"]').val();
var time = $('input[name="time"]').val();
var sendmsg;
for (sendmsg = 1; sendmsg <= amount; sendmsg++) {
(function(sendmsg){
setTimeout(function() {
$.ajax({
type: 'POST',
data: {
provider: provider,
message: message,
phonenum: phonenum,
amount: amount,
otherprov: otherprov,
time: time * 1000 * sendmsg
},
url: 'send.php',
success: function(data) {
console.log('Success. Sent ' + sendmsg + " texts.");
},
error: function(xhr, err) {
console.log("readyState: " + xhr.readyState + "'nstatus: " + xhr.status);
console.log("responseText: " + xhr.responseText);
}
});
}, time * 1000 * sendmsg);
})(sendmsg);
}
}
这是一个
范围问题。
阅读更多关于 Javascript 闭包(作用域)函数的信息:http://brackets.clementng.me/post/24150213014/example-of-a-javascript-closure-settimeout-inside
将代码更改为:
for (sendmsg = 1; sendmsg <= amount; sendmsg++) {
(function(){
setTimeout(function(_provider, _message, _phonenum, _amount, _otherprov, _time, _sendmsg) {
$.ajax({
type: 'POST',
data: {
provider: _provider,
message: _message,
phonenum: _phonenum,
amount: _amount,
otherprov: _otherprov,
time: _time
},
url: 'send.php',
success: function(data) {
console.log('Success. Sent ' + _sendmsg + " texts.");
},
error: function(xhr, err) {
console.log("readyState: " + xhr.readyState + "'nstatus: " + xhr.status);
console.log("responseText: " + xhr.responseText);
}
});
}, time);
})(provider, message, phonenum, amount, otherprov, time, sendmsg);
}
希望有帮助。
相关文章:
- 使用每500ms运行一次的jquery函数是个好主意吗
- For循环在Jquery中只运行一次
- 谷歌图表在运行应用程序时只能显示一次
- 使函数只运行一次(Javascript)
- 更改路由后,运行一次js脚本
- 只运行一次提取的脚本
- 可能只在for循环内部运行一次代码块
- 在单击事件中,第一次单击时激发代码一次,其余代码在所有单击时运行
- 在Flask中使用.getJSON请求时,只运行一次命令
- 运行“;非“;单击另一个函数中的函数仅一次
- JavaScript只有在最后一次被调用时才运行函数
- 数据互绑定问题:转换器只运行一次,无法绑定元素的 ID
- 您可以在节点.js上一次运行多个应用程序吗?
- 如何一次运行一次循环javascript
- 从命令行一次运行大量摩卡测试的好方法是什么
- 如何让 JavaScript 一次运行一个字符串
- 无法在一次运行中删除多个数组元素
- 如何使jquery函数一次运行一个
- 在一次运行中分配并返回一个变量
- 一次运行2个动画