Я работаю над проектом PHP Laravel, в соответствии с которым, когда пользователь нажимает кнопку на веб-сайте, я выполняю некоторую фоновую задачу, используя AJAX для бэкэнда PHP, когда я инициирую вызов платежного шлюза, когда пользователь платит через свой телефон ,, Я проверяю статус платежа (где 1 означает, что оплачено, 0 означает, что не оплачено), и если статус равен 1, я перенаправляю пользователя на страницу успеха.
В настоящее время я использую AJAX для отправки данных из внешнего интерфейса в бэкэнд, и я хочу периодически публиковать данные через 5 секунд (где я даю пользователю некоторое время, чтобы заплатить, прежде чем обратиться к API, чтобы узнать, изменился ли статус на 1, затем перенаправить пользователя).
Я пытаюсь использовать метод setTimeout в JavaScript и dd () данные из контроллера, который сбрасывает данные только один раз, но не сбрасывает через 5 секунд
Код AJAX для публикации данных в бэкэнд через 5 секунд
$('.mpesa').on('click', function () {
// run the first time; all subsequent calls will take care of themselves
setTimeout(executeQuery, 5000);
});
function executeQuery() {
alert('clicked');
//Adds Class to the page when it loads
$('.PAY').addClass("loading");
//Gets the MPESA type
var type = $('.mpesa').prop('id');
var quote = $('#quote').val();
var phone = $('#phone').val();
//Converts to a JSON object
var type ={
'type': type,
'quote' : quote,
'phone' : phone,
};
console.log(type);
$.ajax({
//Contains controller of payment
type: 'POST',
url: 'paymentFinal',
data: JSON.stringify(type),
contentType: 'application/json',
dataType: "json",
success: function success(response) {
console.log(response);
},
error: function error(data) {
console.log(data);
}
});
}
//End AJAX call
Файл контроллера вызывается
public
function payFinal(Request $request)
{
dd($request->all());
}
Обновленный код AJAX
$('.mpesa').on('click', function () {
setInterval(function() {
alert('clicked');
//Gets the MPESA type
var type = $('.mpesa').prop('id');
var quote = $('#quote').val();
var phone = $('#phone').val();
//Converts to a JSON object
var type ={
'type': type,
'quote' : quote,
'phone' : phone,
};
console.log(type);
$.ajax({
//Contains controller of payment
type: 'POST',
url: 'paymentFinal',
data: JSON.stringify(type),
contentType: 'application/json',
dataType: "json",
success: function success(response) {
if(response) {
window.location.href="success";
}
},
error: function error(data) {
console.log(data);
}
});
}, 15000); // Execute every 15 seconds
});
setTimeout
выполняет указанную функцию только один раз после установленной вами задержки. использование setInterval
вместо этого, чтобы ваша функция периодически вызывалась.
================================================== =======================
Обновить:
Вы хотите, чтобы ваша функция выполнялась немедленно, когда пользователь щелкает, а после этого вызывает себя каждые 15 секунд. Чтобы достичь этого, вы можете просто использовать следующий код:
$('.mpesa').on('click', executeQuery);
function executeQuery() {
alert('clicked');
//Adds Class to the page when it loads
$('.PAY').addClass("loading");
//Gets the MPESA type
var type = $('.mpesa').prop('id');
var quote = $('#quote').val();
var phone = $('#phone').val();
//Converts to a JSON object
var type ={
'type': type,
'quote' : quote,
'phone' : phone,
};
console.log(type);
$.ajax({
//Contains controller of payment
type: 'POST',
url: 'paymentFinal',
data: JSON.stringify(type),
contentType: 'application/json',
dataType: "json",
success: function success(response) {
console.log(response);
},
error: function error(data) {
console.log(data);
}
});
//use setTimeout here
setTimeout(executeQuery, 15000);
}
использование setTimeout
в вашей функции вызов сам по себе решит вашу проблему.
================================================== =======================
[Чтобы ответить на вопрос ОП о том, как остановить таймер]В вашей функции, скажем, вы хотите, чтобы функция прекратила выполнение через 5 раз.
Установите переменную вне функции:
var counter = 0;
Затем в executeQuery
:
if (counter <= 5) { //or use your own logic
counter++;
setTimeout(executeQuery, 15000);
}
Помни что setTimeout
это единовременная вещь, так что вы можете просто контролировать, когда прекратить звонить.
Других решений пока нет …