Неполадка при репостинге данных с использованием AJAX в бэкэнд Laravel - PullRequest
0 голосов
/ 23 октября 2018

Я работаю над проектом 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
});

1 Ответ

0 голосов
/ 23 октября 2018

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 в вашей функции для вызова себя решит вашу проблему.

=========================================================================

[Чтобы ответить на вопрос OP о том, как остановить таймер]

В вашей функции, скажем, вы хотите, чтобы функция остановиласьвыполнение через 5 раз.

Установите переменную вне функции:

var counter = 0;

Затем в executeQuery:

if (counter <= 5) { //or use your own logic
    counter++;
    setTimeout(executeQuery, 15000);
}

Помните, что setTimeout - этоодноразовая вещь, так что вы можете просто контролировать, когда прекратить звонить.

...