У меня есть следующий сценарий длинного опроса 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; }
поток
Когда я создаю страницу, сценарий ajax запускается и ждет ответа. Когда я проверил вкладку сети, ajax бесконечно делал запросы на указанный URL.
Я получаю сообщение формы с внешнего веб-сайта на бэкэнд-PHP, который мне нужно нажать на jquery.
Но когда сообщение происходит, в консоли ничего не записывается. Но если я буду жестко закодировать некоторые значения в $ json и echo, то он появится в консоли.
Я столкнулся с двумя проблемами
Когда сообщение появляется в скрипте PHP, оно не появляется в коде ajax.
Когда я жестко код (имитировал ответ, отправленный внешним сообщением формы), $ 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.
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, поэтому, если нет, ваш аякс никогда не получит уведомление, вы знаете, что я имею в виду?