Использование длинного опроса ajax для обновления ответа на моей странице с внешнего API

У меня есть следующий сценарий длинного опроса ajax

(function poll(){ $.ajax({ url: "<?php echo URL::to('/internal/v1/checkTxn'); ?>", success: function(data){ //Update your dashboard gauge console.log(data.status); //Data is getting logged if(data.status == 'success'){ //This condition is not being checked console.log('suucesful'); //Not coming } }, dataType: "json", complete: poll, timeout: 1000 }); })(); 

Внутренний PHP- код выглядит следующим образом

  if(isset($_POST['status']) && $_POST['status']){ $data = ['status'=>$_POST['status']]; $json = json_encode( $data ); echo $json; } 

поток

  1. Когда я создаю страницу, сценарий ajax запускается и ждет ответа. Когда я проверил вкладку сети, ajax бесконечно делал запросы на указанный URL.

  2. Я получаю сообщение формы с внешнего веб-сайта на бэкэнд-PHP, который мне нужно нажать на jquery.

    Но когда сообщение происходит, в консоли ничего не записывается. Но если я буду жестко закодировать некоторые значения в $ json и echo, то он появится в консоли.

    Я столкнулся с двумя проблемами

    1. Когда сообщение появляется в скрипте PHP, оно не появляется в коде ajax.

    2. Когда я жестко код (имитировал ответ, отправленный внешним сообщением формы), $ json и эхо его, он появляется в консоли, но условие для data.status == 'success' не проверяется.

    Что в этом плохого. Я что-то упускаю?

    ОБНОВИТЬ

     I could fix the "condition not being checked" as there was something wrong the json being echoed. Now to avoid confusion, the flow for this User open the page, > The ajax starts the long polling process to my PHP code, waiting for a > response.User enters payment details in a form which is my html,clicks on pay, a pop up appears > which renders the banks login page (Payment gateway).After user entering all > details in the pop up (banks page), bank sents a server to server call about the status of > transaction to my notificationURL > ('mydomain.com/internal.v1/checkTxn'). As soon as I get a POST on this > URL(I will close the pop up), my ajax polling should get the data posted to my PHP and there by > I will show the status of TXN to the user on the same card form he entered his details earlier and > the pop window closes. The response here is returned by my PHP code to the ajax. The > post coming to my PHP code is a server to server post which is posted > by a Payment Gateway. 

    Related of "Использование длинного опроса ajax для обновления ответа на моей странице с внешнего API"

    1. давайте отлаживаем это:

    установите обратный вызов ошибки ajax,

     $(function(){ (function poll(){ $.ajax({ url: "http://tinyissue.localhost.com/test.php", success: function(data){ //Update your dashboard gauge console.log(data.status); //Data is getting logged if(data.status == 'success'){ //This condition is not being checked console.log('suucesful'); //Not coming } },error:function(err){ console.info('error fired...'); console.info(err); }, dataType: "json", complete: poll, timeout: 1000 }); })(); }); 

    запустите это, вы получите консоль

     error fired... Object {readyState: 4, responseText: "", status: 200, statusText: "OK"} 

    2. Почему обратился к ошибке:

    Почему status ответа ajax равен 200, а statusText«ОК» , error обратного вызова по-прежнему запускается вместо success ?

    Ваш запрос AJAX содержит следующую настройку:

     dataType: "json" 

    В документации указано, что jQuery:

    Оценивает ответ как JSON и возвращает объект JavaScript. (…) Данные JSON обрабатываются строгим образом; любой отклоненный JSON отклоняется и возникает ошибка синтаксического анализа.

    Это означает, что если сервер возвращает недействительный JSON с статусом 200 OK, тогда jQuery запускает функцию ошибки и устанавливает параметр textStatus в значение «parsererror».

    Решение: убедитесь, что сервер возвращает действительный JSON . Стоит отметить, что пустой ответ также считается недействительным JSON; вы можете вернуть {} или нуль, например, которые проверяются как JSON.

    3. Почему ajax возвращает недопустимый JSON:

    На ваш взгляд, на стороне сервера вы проверили $_POST['status'] чтобы убедиться в успешности последнего звонка в опросе цикла, задан только $_POST['status'] , вы будете эхо json или ничего не услышите.

    Но, к сожалению, в начале цикла вызова при первом вызове ajax вы не установили status для публикации. Затем он ничего не слышит, затем идет обратный вызов error , также идет complete обратный вызов, а затем вызывается снова без status для публикации. Понимаете, это был неудачный цикл.

    4. Решение:

    Задайте значение status для публикации при первом вызове ajax.

     $(function(){ (function poll(){ var status = 'success'; $.ajax({ url: "http://tinyissue.localhost.com/test.php", success: function(data){ //Update your dashboard gauge console.log(data.status); //Data is getting logged status = data.status; if(data.status == 'success'){ //This condition is not being checked console.log('suucesful'); //Not coming } },error:function(err){ console.info('error fired...'); console.info(err); status = 'error'; }, type:'post',dataType: "json", data:{status:status}, complete: poll, timeout: 1000 }); })(); }); 

    Если вы используете длительный опрос, может возникнуть проблема с кешем. Во-первых, когда ваше сообщение приходит в вашу систему, проверьте, что checkTxn изменяется. Наконец, вы можете добавить случайный параметр (например, добавив дату в миллисекундах) в запросе url, вы не будете его использовать, но ваш сервер будет считать ваши запросы разными.

    Пожалуйста, проверьте это и сообщите нам.

    @Edit: Конечно @Ajeesh, я объясню это:

     (function poll(){ $.ajax({ url: "<?php echo URL::to('/internal/v1/checkTxn'); ?>?_ts=" + new Date().getTime(), success: function(data){ //Update your dashboard gauge console.log(data.status); //Data is getting logged if(data.status == 'success'){ //This condition is not being checked console.log('suucesful'); //Not coming } }, dataType: "json", complete: poll, timeout: 1000 }); })(); 

    Делая это, кеш не будет использоваться, потому что все запросы различны для вашего сервера / браузера.

    С другой стороны, я прошу вас о любых изменениях на вашей странице, когда вы получаете POST, поэтому, если нет, ваш аякс никогда не получит уведомление, вы знаете, что я имею в виду?