2009-02-07 4 views
1

Je sais à première vue (en raison du titre) cela ressemble à l'un des "Avez-vous essayé de rechercher Google avant de poster?" questions, mais je n'arrive pas à trouver une réponse au problème que je rencontre. Désolé si je suis un noob ... encore en train d'apprendre :)Saisie séquentielle de plusieurs délais d'attente aléatoires en JavaScript

Je dois simuler une pause en javascript, mais la fonction setTimeout (fonction_call, timeout) ne fonctionne pas pour moi. Raison d'être ... lorsque cette fonction setTimeout est appelée, elle appelle ensuite la fonction de manière asynchrone. J'essaie de simuler du texte tapé dans un div à des intervalles temporels aléatoires. Je veux qu'il apparaisse comme si une personne tape un message pendant que l'utilisateur consulte la page. Comme le timeout est un intervalle aléatoire et que l'appel de fonction est fait de manière asynchrone, le texte finit par être imprimé dans un ordre aléatoire.

Voici un extrait de ce que j'ai jusqu'ici:

typeString: function(s) 
{ 
    for(var i=0;i<s.length;i++) 
    {      
     var c = s.charAt(i); 
     var temp = setTimeout("MessageType.typeChar('" + c + "')", this.genRandomTime()); 
    } 
} 



Merci d'avance pour votre aide.

CJAM



MISE À JOUR: En ajoutant le délai de temporisation à un varialbe, il m'a permis de compenser pour les appels timeOut asynchrones. Merci à tous pour vos réponses rapides. Voici le code mis à jour:

typeString: function(s) 
{ 
    var delay = 0; 

    for(var i=0;i<s.length;i++) 
    {      
     var c = s.charAt(i); 
     setTimeout("GoogleTyper.typeChar('"+c+"')", delay += this.genRandomTime()); 
    } 
} 

Répondre

3

Avez-vous essayé de définir cumulativement le délai d'expiration? Collez une variable en dehors de votre boucle et initialisez-la à 0. Appelons-la timeout pour l'instant. Ajouter une quantité aléatoire de temps à cette variable au début de chaque itération de votre boucle, et faire en sorte que le délai d'attente de travail. De cette façon, vous êtes assuré que les fonctions sont appelées dans l'ordre.

2

Votre problème est que vous en utilisez un tous vos temps sont retardés à partir de maintenant - le prochain temporisateur doit être déclenché après le précédent. Ajoutez simplement le délai de la minuterie précédente au nouveau minuteur.

typeString: function(s) 
{ 
    var delay = 0; 
    for(var i=0;i<s.length;i++) 
    {      
     var c = s.charAt(i); 
     delay = delay + this.genRandomTime(); 
     var temp = setTimeout("MessageType.typeChar('" + c + "')", delay); 
    } 
} 
+0

J'aime votre réponse parce que c'est très détaillé, mais je dois donner le crédit à Stuart B puisqu'il l'a posté avant le vôtre. Le vieux pistolet le plus rapide de la routine ouest :(J'espère que d'autres personnes vous mettront en colère et vous rapporteront des points pour être gentil et aider. – regex

1

Au lieu de passer à chaque événement de minuterie caractère à afficher, que chacun gestionnaire d'événements saisir le caractère suivant hors d'une file d'attente (tableau, liste que ce soit), de sorte que l'ordre est maintenu.

Questions connexes