стратегия разделения вывода php на более мелкие выводы (ajax, php) (вложенные вызовы ajax, ajax внутри ajax?) - PullRequest
1 голос
/ 29 июля 2010

Я не знаю правильной терминологии для поиска решения. Пожалуйста, предложите стратегию, чтобы разбить вывод php на маленькие куски и пошагово передать их в ajax's responseText.

Проект представляет собой веб-страницу ajax, которая принимает текстовую строку (фамилию) и передает ее в программу php. Код php берет фамилию и случайным образом выбирает 3 человек с разными именами и помещает их в массив. Как только это будет сделано, код php свяжется с внешними серверами, чтобы получить информацию, связанную с каждым именем, и вывести информацию в div веб-страницы. Процесс получения данных с внешних серверов очень медленный.

Этот код в основном выполнен, но весь процесс занимает очень много времени, чтобы сгенерировать вывод на экран. Есть ли способ (стратегия) немедленно выводить каждый шаг php-кода вместо того, чтобы ждать завершения кода?

Мой псевдо-PHP-код выглядит так:

<?

get 3 names; //output this immediately

foreach name { get phone number } 

?>

Кроме того, я мог бы получить имя и номер телефона и вывести их непосредственно перед переходом к следующему имени.

Существуют ли php или ajax коды / функции / стратегии, которые бы этого достигли? Пожалуйста, предложите решения или ключевые слова для поиска.

Добавление / редактирование:

Спасибо за предложения. Можно ли выполнить другой вызов ajax после родительского вызова ajax? Сначала я пошел по этому пути, но мое тестирование вложенного вызова js / ajax не сработало. Это может быть связано с синтаксическими ошибками, просмотрите код.

Тестовый код в файле testajax.php (или testajax.html) для вызова ajax XHR.responseText имеет значение

<div id="name" >JAM  <div id="numa" > 
<br />
<br />text holder >>

<script type="text/javascript">
var pid=document.getElementById("numa").parentNode.id;

alert (pid);

document.getElementById('numa').innerHTML += 'append text>> ';

document.write(' docwrite');    
</script> 

</div>  
</div>
<br />
<br />ending text

Если я просматриваю файл testajax.php (или testajax.html) напрямую, я вижу

JAM


text holder >> (an alert window) append text>> docwrite


ending text

но если я сделаю ajax-вызов файла testajax.php, все, что я увижу, это

JAM


text holder >> 


ending text

Код внутри тегов <script> </script> не запускается после вызова ajax

Может кто-нибудь объяснить это и предложить исправление?

ТИА

Ответы [ 2 ]

0 голосов
/ 29 июля 2010

Теоретически, да, вы можете вызвать flush()ob_flush() при необходимости), чтобы убедиться, что вывод отправляется из PHP.

Однако веб-сервер может добавить собственную буферизацию вне области действия PHP (чаще всего, если в Apache используется mod_deflate); и вы должны быть осторожны с разделением блоков ответа, чтобы они не читались браузером до тех пор, пока блок не будет завершен.

В любом случае не все браузеры могут читать responseText с XMLHttpRequest до тех пор, пока запрос не будет полностью выполнен. Таким образом, чтобы он работал на всех клиентах, вам нужно попробовать другой механизм, такой как старая школа HTML-iframe -sing-множественные- <script> s.

Резюме: это куча хлопот, и, возможно, не стоит того. Более простой для развертывания вариант - отдельные запросы AJAX для каждого имени.

0 голосов
/ 29 июля 2010

Не зная реальный код и основанный на коде ответ сложно.Но вот идея.

Когда вы получите три имени, верните их на страницу и отобразите их.Затем, для каждого, в отдельном вызове AJAX, позвоните по телефону.Я не уверен, что javascript будет выполнять все три вызова независимо друг от друга, но при этом будут отображаться по крайней мере все 3 имени, а затем информация о каждом телефоне по одному.


Редактировать

Рабочий процесс:

  • Javascript отправляет имя php через ajax.
  • PHP возвращает 3 имени для js
  • js добавляет 3 div к странице, по одному с каждым именем.
  • js делает 3 запроса к php, отправляя 1 имя на запрос.
  • php возвращает информацию о телефоне / что-либо ещеjs
  • js берет информацию и добавляет ее в соответствующий div
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...