2010-11-19 4 views
3

CoffeeScriptとJavaScriptの違いをいくつか紹介しています。関数をキューイングする。この例では、私はあなたが私がのCoffeeScriptでこれを書き換えるでしょう。特にどのようにCoffeeScriptのCoffeescript、どのように私はこのキューに入れられた関数の例、特にループを書くだろうか?

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())(); 
    } 

でこれを処理するだろうどのように混乱していますか?

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

答えて

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

funcs = [ f1, f2, f3 ] 

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

next() 
+0

completeCallback関数を書く必要がありますか? – Handloomweaver

+0

編集された 'next'は、キューに入れられた各関数は、それに渡された引数(ここでは、 'f1'の仮パラメータ名は' completeCallback'でした)を呼び出して、次のキューに入れられた関数が呼び出されるようにしなければなりません – yfeldblum

+0

'f1' AJAX呼び出しを設定してすぐに戻ることができます。一方、AJAX呼び出しには、後でブラウザが呼び出す 'success'ハンドラ関数を渡します。 eは、成功ハンドラ関数が呼び出され、 'f1'が返されるまで(これはあなたの問題の説明に従う)だけでなく、完了するまで保持します。 – yfeldblum

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

funqueue = [fun1, fun2] 

el() for el in funqueue 
+0

驚くほど簡単な構文。しかし、私はどのように前のものが終了したときにだけ機能を発火させるでしょうか? – Handloomweaver

+0

CoffeeScriptの使用方法や並行キューの作成方法を尋ねていますか? – yfeldblum

+1

この例はシーケンシャルです - 配列上でループするCoffeeScriptは、並列ではなくシーケンシャルなので、キュー内の各関数はCoffeeScriptループが次の関数を呼び出す前に返さなければなりません。 – yfeldblum

関連する問題