2017-08-28 5 views
0

J'ai un champ de texte dans lequel je veux sortir un mot à la fois. Les mots sont dans un tableau. Le délai entre les mots à afficher est réglé sur 1 seconde. Le premier mot est montré 2 sec. D'où les doubles déclarations bizarres.Itération avec délai dans l'outil de création de trame

msgArray = [ 
    ["Hello", "World"], 
    ["89:23", "Tom Eriksen","Scooores!!"], 
    ["Overtime", "about to", "start"]] 

printMessageLoop = (msgArray, target) -> 
target.text = msgArray[0] 
timeToRead = 1 
Utils.delay timeToRead,() -> 
    for i in [1..msgArray.length-1] 
     Utils.delay timeToRead*i,() -> 
      target.text = msgArray[i] 
      print "i="+i #debugging purpose 

Quand j'appelle printMessageLoop(msgArray[2]) les target affiche le premier mot correctement, mais deux derniers est « non défini ». L'impression dit:

printMessageLoop(msgArray[2]) 

»i=3 
»i=3 

Il semble que lorsque la ligne est exécutée target.text = msgArray[i] que i est réglé sur la dernière i. C'est-à-dire i ++ = 3

Pourquoi? Et comment puis-je contourner cela?

Répondre

0

appel do (i) -> avant que le délai pour vous assurer que la valeur actuelle de i est transmis dans les futures instructions

printMessageLoop = (msgArray, target) -> 
target.text = msgArray[0] 
timeToRead = target.text.length/20 * readingSpeed 
Utils.delay timeToRead,() -> 
    for i in [1..msgArray.length-1] 
     do (i) -> 
      Utils.delay timeToRead*i,() -> 
       target.text = msgArray[i ] 
       print "i="+i 
       timeToRead = target.text.length/20 * readingSpeed