Моя цель — выполнять функцию javascript каждые X секунд. Я читал, что 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
ведущий неожиданное поведение ..
В приведенном ниже коде временная область видимости определяется на каждой итерации, что дает разные sendmsg
ценность для каждого timeout
событие.
Вы также должны запланировать различное время как значение времени ожидания в каждой итерации, чтобы выполнить их в разные времена ожидания.
Измените свой код, как это ..
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);
}
надеюсь, это поможет.