2011-12-30 10 views
2

私は、各要素をループし、その要素の各属性をループするスクリプトを用意しています。要素の属性名が別のオブジェクト(shims)のキー名と一致する場合は、JSシムが実行されます。 JSシムが配列に追加されます(エラー)。 結局のところのシム(任意のシムでも実行された場合)私の周り私の頭をラップ厳しい時間を過ごしていコールバックを追跡してデータを単一の配列として送信する

<input data-foobar="true">

shims:{ 
'data-foobar':function(){ 
    //AJAX stuff... 
    if(there_was_an_error){ 
     errors.push({element:ele,error:'OH NOES!'}) 
    } 
    } 
} 

すなわち単一のアレイとして送信されたデータを返しました彼らはすべてミリ秒離れて走っているので、これらのすべてを追跡していますが、明らかに、これらがAJAXのDBへの呼び出しであることを返すのに時間がかかることがあります。

私が考えることができる唯一の方法は、 "shimsRunning++"のようなカウンターを増やしてから、チェックを受けることです。if(shimsRunning === 0){ callback(this,errors) }。これは本当にこれを行う最善の方法ですか?応答を待っているコールバックカウンタを維持するためのクルージングと思われる...

ああ、これらはすべてボタンを押して実行されます(送信)。そして、私はこれらのすべてが応答するまで待つ必要があるので、エラーがあるかどうかを知っています。そうであれば、何があってもなくても、フォームが提出されます。

+0

あなたが話すkludgeは、node.jsで一般的に行われています。ほとんどのフォーク結合ループがどのように機能するかを示します。 –

+0

OK、ありがとう。私はちょうど私がこのクリーナーを作るだろうデザインパターンを紛失していないことを確認していた –

答えて

0

いいフローコントロールライブラリが必要ですね。

https://github.com/caolan/asyncは一般的な(良い)ものです。

var asyncTasks = ["a", "b"] 

function runTask (task, done) { 
    somethingAsync(function (err) { 
     done(err) 
    }) 
} 

async.forEachSeries(asyncTasks, runTask, function (err) { 
    // runs when all tasks are done 
    // if one of them calls done with an error, 
    // this will be called right away with that error 
}) 

これは、実行タスクを順番に実行します(前のタスクが終了したときに次のタスクを実行します)。それらを並列に実行したい場合は、async.forEachをチェックしてください。 xを並列に実行したい場合はasync.forEachLimitをチェックしてください。

関連する問題