Actuellement, j'utilise SetInterval pour exécuter plusieurs fonctions AJAX qui appellent des pages PHP comme SO -
function Send() {
var name = document.getElementById('name').value;
var message = document.getElementById('message').value;
var xmlhttp = getXMLHttp();
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4)
{
document.getElementById('message').value = "";
if(xmlhttp.responseText != "") {
var chat = document.getElementById('messagebox');
chat.innerHTML = chat.innerHTML + '<div class=\"alert\">' + xmlhttp.responseText + '</div>';
chat.scrollTop = 1000000000;
}
}
}
xmlhttp.open("POST","submit_message.php",true);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.send("name=" + name + "&message=" + message);
}
3 Réponses :
Vous pouvez créer une fonction auto invoquant avec la différence ici est que cela fonctionnerait similaire à Voir la settimeout code> comme ceci: setInterval Code> mais contrairement à cela, le prochain appel à la fonction ne sera exécuté qu'après votre logique de code ici code> la pièce a fini d'exécuter. p>
Le moyen facile consiste à réapparaître aveuglément ceci attendrait 1500ms entre vos processus. Comme ceci: 300ms Processus, 1500 ms Wait, 2000ms Processus, 1500 ms Paiement, 400 ms Processus, 1500 ms Wait ... P> Un peu plus étroitement à ce que vous voulez, vous pouvez réappliquer Settimeout code> à la fin de votre processus: Settimeout code> au début em> de votre processus. Dans ce cas, vous obtiendrez: 300 ms PROCESSION, PROCESSUS DE 1200MS, PROCESSUS 2000MS, 0MS ATTENDRE, PROCESSUS 400MS, 1100MS ATTENDRE ... Le problème qui se produit avec seinterval code> ne se produit pas ici, parce que ceci Seuls seulement l'itération Suivant em>, pas tous les futurs. Notez également que, étant donné que JS est fileté unique, un événement ne peut s'interrompler comme si vous pouviez obtenir dans d'autres langues. P> function foo() {
setTimeout(foo, 1500);
// possibly long task
}
foo();
Merci, c'est exactement ce dont j'ai besoin. Je n'ai pas réalisé que je pouvais définir des paramètres pour affecter l'itération d'une fonction à l'intérieur de la propre déclaration de la fonction.
Morgan prenne toujours une autre demande Ajax lorsque l'on est terminée, essayez donc de la réponse de @ Tomasznurkiewicz
Vous pouvez remplacer seinterval () code> avec settimeout () code> être constamment reporté sur chaque réponse AJAX: function Send() {
//...
xmlhttp.onreadystatechange = function() {
if(xmlhttp.readyState == 4) {
setTimeout(Send, 1500);
//...
}
}
}
Send();
meilleure réponse mais il n'est pas étiqueté sous jQuery
C'est une réponse utile, mais je préfère ne pas ajouter JQuery pour une seule tâche. :)
@SomebodyIsIntintrouble: JQuery a été utilisé uniquement pour mettre en valeur l'idée, mais puisque OP a posté le code d'origine, à l'aide de RAW XMLHTTPQUEST à la place.
@Morgan: Désolé, JQuery était vraiment pertinent là-bas, voici une version utilisant un ajax ordinaire.
@Tomasz ne voulait pas se plaindre, ne faisait que signaler. Merci quand même!
Il suffit d'appeler Settimeout à la fin de la fonction à la place?
Montrez vos appels Ajax afin que nous puissions fournir une meilleure réponse.
@James puis-je vraiment appeler une fonction à l'intérieur de lui-même?
@Morgan: Vous pouvez appeler une fonction de l'intérieur lui-même, elle s'appelle Recursion . Cependant, ici, vous n'appelez pas une fonction de l'intérieur lui-même, vous êtes la planification i> une fonction de l'intérieur lui-même - qui est quelque peu différente (et oui aussi possible). En fait, la planification d'une fonction est plus simple, car vous ne sortez pas de pile (un danger commun avec une vraie récursion, en particulier dans les langues sans Optimisation de la queue ). Pour plus d'amusement: voir "Voulez-vous dire ..." Dans Google .
Seinterval est très utile. J'étais au courant de la récursion mais je pensais que la plupart des langues ne l'ont pas permis de se produire.
La plupart des langues font i> permettent de récupérer - certainement 100% des langues que je souhaite travailler avec faire. Mais normalement, la récursivité est utilisée de manière à ce qu'une condition dans la fonction l'empêche de trop de niveaux profond, par exemple, si vous analysez de manière récursive une structure de données d'arborescence, vous allez finalement aller au fond de l'arbre et commencer à revenir ... (et Comme AMADAN A expliqué, vous ne voulez pas de récursion ici de toute façon: en utilisant
Settimeout code> dans les horaires de fonctions un appel ultérieur à lui-même qui n'est pas une récursive.)J'étais juste toujours enseigné que la récursivité était "dangereuse" et d'éviter cela. Ce n'est pas assez souvent jusqu'à maintenant que je l'aurais interrogé.