2010-11-19 3 views
3

J'essaie d'obtenir des exemples sous ma ceinture de la façon dont vous feriez quelque chose de différent dans CoffeeScript à JavaScript. Dans cet exemple de faire la queue fonctions Je suis confus comment vous feriez gérer cela dans CoffeeScriptCoffeescript, comment j'écrirais cet exemple de fonctions en file d'attente, en particulier la boucle?

wrapFunction = (fn, context, params) -> 
      return -> 
       fn.apply(context, params)   

    sayStuff = (str) -> 
     alert(str) 


    fun1 = wrapFunction(sayStuff, this, ['Hello Fun1']) 
    fun2 = wrapFunction(sayStuff, this, ['Hello Fun2']) 

    funqueue = [] 
    funqueue.push(fun1) 
    funqueue.push(fun2) 

    while (funqueue.length > 0) { 
     (funqueue.shift())(); 
    } 

Surtout comment pourrais-je réécrire cela en CoffeeScript?

while (Array.length > 0) { 
    (Array.shift())(); 

Répondre

3
f1 = (completeCallback) -> 
    console.log('Waiting...') 
    completeCallback() 

funcs = [ f1, f2, f3 ] 

next = -> 
    if funcs.length > 0 
    k = funcs.shift() 
    k(next) 

next() 
+0

Donc, je dois juste écrire une fonction completeCallback – Handloomweaver

+0

Edited. 'next' se passe comme argument dans chaque fonction mise en file d'attente Chaque fonction mise en file d'attente devrait s'assurer d'appeler l'argument passé (ici, le nom du paramètre formel dans 'f1' était' completeCallback') afin de provoquer l'invocation de la prochaine fonction en file d'attente – yfeldblum

+0

Ceci est nécessaire car 'f1' peut mettre en place un appel AJAX et revenir immédiatement.Pendant ce temps, il passe dans l'appel AJAX une fonction de gestionnaire de '' succès '' que le navigateur appellera à un point ultérieur. e est maintenu jusqu'à ce que la fonction de gestionnaire de succès soit invoquée et se termine également, pas seulement jusqu'à ce que 'f1' soit retourné (ceci est par votre description du problème). – yfeldblum

4
fun1 = -> alert 'Hello Fun1' 
fun2 = -> alert 'Hello Fun2' 

funqueue = [fun1, fun2] 

el() for el in funqueue 
+0

syntaxe Incroyablement plus simple. Cependant comment pourrais-je faire que les fonctions tirent seulement quand le précédent avait fini? – Handloomweaver

+0

Demandez-vous comment utiliser CoffeeScript ou comment écrire une file d'attente simultanée? – yfeldblum

+1

Cet exemple est séquentiel - Le bouclage de CoffeeScript sur un tableau est séquentiel, et non parallèle, de sorte que chaque fonction dans la file d'attente devra retourner avant que la boucle CoffeeScript n'appelle la suivante. – yfeldblum

Questions connexes