2010-07-29 4 views
1

Je ne connais pas la terminologie correcte pour rechercher la solution. Veuillez suggérer une stratégie pour diviser la sortie de php en petits morceaux et les passer pas à pas à responseText d'ajax.stratégie pour diviser la sortie php en plus petites sorties (ajax, php) (ajax appels imbriqués, ajax dans ajax?)

Le projet est une page Web ajax qui prend une chaîne de texte (nom de famille) et la transmet à un programme PHP. Le code php prend le nom de famille et récupère aléatoirement 3 personnes avec des prénoms différents, et les met dans un tableau. Une fois cela fait, le code php contactera les serveurs externes pour récupérer les informations associées à chaque nom, et affichera les informations dans un div de la page Web. Le processus d'obtention de données à partir des serveurs externes est très lent.

Ce code est essentiellement fait, mais l'ensemble du processus prend beaucoup de temps pour générer la sortie sur l'écran. Existe-t-il un moyen (une stratégie) de produire immédiatement chaque étape du code php au lieu de devoir attendre le code complet?

Mon pseudo code php est comme ceci:

<? 

get 3 names; //output this immediately 

foreach name { get phone number } 

?> 

Sinon, je pourrais obtenir un nom et le téléphone #, et la sortie immédiatement avant de passer au nom suivant.

Existe-t-il des codes/fonctions/stratégies php ou ajax permettant d'atteindre cet objectif? Veuillez suggérer des solutions ou rechercher des mots-clés.

Addition/Edit:

Merci pour les suggestions. Est-il possible d'exécuter un autre appel ajax après l'appel ajax parent? J'ai d'abord suivi cette route, mais mes tests de l'appel js/ajax imbriqué n'ont pas fonctionné. Cela peut être dû à des erreurs de syntaxe, veuillez regarder par-dessus le code.

Le code de test dans le testajax.php (ou testajax.html) fichier pour le xhr.responseText d'appel ajax est

<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 

Si je considère le fichier testajax.php (ou testajax.html) directement, Je verrais

JAM 


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


ending text 

mais si je fais un appel ajax du fichier testajax.php, tout ce que je voyais est

JAM 


text holder >> 


ending text 

Le code à l'intérieur des balises <script> </script> ne s'exécute pas après l'appel ajax

Quelqu'un peut-il expliquer cela, et offrir une solution?

TIA

+0

Après la recherche, j'ai découvert que pour que cela fonctionne, le xhr.responseText doit contenir uniquement du code js (). Ensuite, il doit être eval (ie eval (xhr.responseText);). Mon xhr.responsetext était un mélange de code html et js, donc eval ne fonctionnerait pas. En outre, eval dans un appel ajax ne fonctionne pas dans les navigateurs IE6 (et 7/8?). Voici 2 liens pour expliquer ce http://www.webdeveloper.com/forum/archive/index.php/t-177998.html et http://www.webdeveloper.com/forum/archive/index.php/ t-110448.html – jamex

Répondre

0

Sans connaître le code réel et la réponse basée sur le code est difficile. Mais, voici une idée.

Lorsque vous obtenez les trois noms, retournez-les à la page et affichez-les. Puis, pour chacun d'eux, dans un appel AJAX différent, appelez l'info du téléphone. Je ne suis pas certain que javascript fera les trois appels indépendamment les uns des autres, mais cela afficherait au moins les trois noms, et ensuite chaque information de téléphone un à la fois.


Modifier

Flux de travail:

  • Javascript envoie un nom à PHP via ajax.
  • PHP renvoie 3 noms à js
  • js ajoute 3 divs à la page, un avec chaque nom.
  • js fait 3 demandes à php, en envoyant 1 nom par requête.
  • retourne php téléphone info/tout ce js
  • js prend information et ajoute à la div
+0

Merci pour la réponse, s'il vous plaît voir la question mise à jour. – jamex

0

respectifs En théorie, oui, vous pouvez appeler flush() (et ob_flush() si nécessaire) pour assurer la production est envoyé depuis PHP. Cependant, le serveur Web peut ajouter un tampon en dehors de la portée de PHP (le plus souvent, si mod_deflate est utilisé sur Apache); et vous devez faire attention à la délimitation de vos segments de réponse afin qu'ils ne soient pas lus par le navigateur tant qu'un morceau n'est pas terminé.

Dans tous les cas, tous les navigateurs ne peuvent pas lire le responseText à partir d'un XMLHttpRequest jusqu'à ce que la demande soit entièrement terminée. Donc, pour que cela fonctionne sur tous les clients, vous devez essayer un mécanisme différent, tel que l'ancien code HTML-iframe-contenant-<script> s.

Résumé: c'est un tas de tracas, et peut-être pas vraiment la peine. Une possibilité de déploiement plus simple serait des requêtes AJAX séparées pour chaque nom.

+0

Merci pour la réponse, je vais vérifier la fonction flush(). Il ne semble pas que je puisse exécuter/appeler un script à partir de la valeur de retour d'un ajax. Toute pensée? – jamex

+0

Pas progressivement, non. Sur certains navigateurs, vous pouvez lire le contenu de 'responseText' quand la réponse est incomplète (' readyState === 3'), ce qui vous permettrait d'interroger le XHR pour une réponse partielle, mais cela ne fonctionne pas partout (par exemple. : C'EST À DIRE). L'ancienne méthode iframe-and-multiple-