2010-11-19 5 views
3

Ich versuche, ein paar Beispiele zu bekommen, wie Sie in CoffeeScript zu JavaScript etwas anders machen würden. In diesem Beispiel von Funktionen Warteschlangen Ich bin verwirrt, wie Sie dieseCoffeescript, wie würde ich diese eingereihten Funktionen Beispiel schreiben, vor allem die Schleife?

in Coffeescript Sie behandeln würden
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())(); 
    } 

Gerade wie würde ich dieses umschreiben in Coffeescript?

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

Antwort

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

funcs = [ f1, f2, f3 ] 

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

next() 
+0

Also muss ich nur eine komplette Callback Funktion schreiben? – Handloomweaver

+0

Edited. 'next' übergibt sich als Argument in jede eingereihte Funktion Jede eingereihte Funktion sollte sicherstellen, dass das darin übergebene Argument aufgerufen wird (der formale Parametername in 'f1' war' completeCallback'), damit die nächste in der Warteschlange stehende Funktion aufgerufen wird. – yfeldblum

+0

Dies ist notwendig, weil 'f1' kann einen AJAX-Aufruf erstellen und sofort zurückgeben, währenddessen er in den AJAX-Aufruf eine 'Erfolgs'-Handler-Funktion übergibt, die der Browser zu einem späteren Zeitpunkt aufrufen wird Es wird so lange gehalten, bis die success-handler-Funktion aufgerufen wird und ebenfalls abgeschlossen ist, und zwar nicht nur, bis 'f1' zurückgegeben wurde (dies ist nach Ihrer Beschreibung des Problems). – yfeldblum

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

funqueue = [fun1, fun2] 

el() for el in funqueue 
+0

Stunningly einfachere Syntax. Wie aber würde ich die Funktionen nur feuern lassen, wenn der vorherige fertig war? – Handloomweaver

+0

Fragen Sie, wie Sie CoffeeScript verwenden oder eine gleichzeitige Warteschlange schreiben? – yfeldblum

+1

Dieses Beispiel ist sequentiell - CoffeeScript, das über ein Array läuft, ist sequentiell, nicht parallel, daher muss jede Funktion in der Warteschlange zurückkehren, bevor die CoffeeScript-Schleife die nächste aufruft. – yfeldblum