2016-05-10 6 views
1

Я следующее Аякса длинного опроса сценарияИспользование Ajax длинный опрос, чтобы обновить ответ на мою страницу из внешнего API

(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 и повторить его, то он появится в консоли.

я столкнулся два вопроса

  1. Когда запись происходит на PHP скрипт, его не придумывают в коде Ajax.

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

Что не так в этом. Я что-то упускаю?

UPDATE

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. 
+0

вы должны сделать JSON.parse (данные), чтобы преобразовать их в объект JS в AJAX на успех, потому что вы получите данные в формате JSON, и я предполагаю, что (функция() {...} (JQuery), вы должны pass jQuery как параметр для IIFE – CY5

+0

Публикация с внешнего сайта может не сработать. Ajax обычно ограничен одним и тем же сайтом. – Brett

+0

@Brett Нет, сообщения на сайте exnst в моем PHP-скрипте, а затем ajax вызывает скрипт php, который находится на моем сервере – Ajeesh

ответ

0

Если вы используете длинный опрос, вы могли бы иметь проблемы кэша. Во-первых, когда ваше сообщение приходит в вашу систему, проверьте, что 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, поэтому, если нет, ваш аякс никогда не получит уведомление, вы знаете, что я имею в виду?

+0

@Tisktkle Можете ли вы прокомментировать? – Ajeesh

+0

Следуя вашим комментариям, невозможно получить запрос POST на вашей странице из вашего опроса ajax или, по крайней мере, это непростая задача. Ваш аякс получает данные html/json из процесса визуализации страницы. Если вы не измените данные страницы, он получит то же самое навсегда. – Tistkle

0

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

установить АЯКС вызов ошибки обратно,

$(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. Почему пошли ошибки обратного вызова:

Почему ajax-ответ status является и statusText is "OK", error callback все еще запущен вместо success?

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

dataType: "json" 

The documentation говорится, что JQuery:

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

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

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

3. Почему Аякса возврат недействителен JSON:

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

Но, к сожалению, в начале цикла вызова в первый раз вызов ajax, вы не установили status для публикации. Тогда он ничего не эхо, затем пошел error callback, также пошел complete callback, а затем снова позвонить без 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 }); 
     })(); 

    }); 
+0

Я думаю, что в этом есть путаница. POST не выполняется Ajax. Это делается внешним сообщением. AJAX-> ОПРОС-> PHP <- POST из внешнего сообщения формы – Ajeesh

+0

Я мог бы исправить ответ не буду. Тем не менее проблема с получением данных, которые публикуются внешним сообщением, по-прежнему сохраняется. – Ajeesh

+0

Немного смущает ... Каждое подключение от клиента к серверу создает '$ _POST' для себя, как может запрос ajax получить переменную' $ _POST' формы post request? Это невозможно ... Или я неправильно понял? –

 Смежные вопросы

  • Нет связанных вопросов^_^