すべての計算が完了するまで、評価関数を再帰的に呼び出すのが良い方法だと思います。計算にキューを使用し、FIFO 方式で処理します。
var computations = [];
n.once('message' を破棄し、evalutate 関数の外側で n.on('message' ハンドラーを定義する必要があります。評価データ型に一致する各 'message' を受け取ります (それを 'result' と呼びましょう)。 . 次に、その結果を結果の FIFO キューに保存します. その後、さらに計算があるかどうかを確認し、もう一度評価を呼び出します. これは、評価関数で最も古い計算を切り離すためにクリーンアップできます。したいです。
var results = [];
n.on('message', function(m) {
if(m.msg === "result") { // message looks like {msg: "result", data: 1234}
results.push(m.data);
}
if(computations.length > 0) {
var comp = computations[0]; // Save oldest computation
computations.splice(0,1); // Remove oldest computation from array
evaluate(comp); // Evaluate oldest computation
}
else
process_results(); // if you have 0 computations left,
// you got the last result so go process them.
});
評価を呼び出す前に、計算をキューにプッシュし、最も古いものを評価に送信する必要があります。
if(computations.length > 0) {
computations.push(new_comp); // Push on your newest compuation
var comp = computations[0]; // Save oldest computation
computations.splice(0,1); // Remove oldest computation from array
evaluate(comp); // Evaluate oldest computation
}
else {
evaluate(new_comp); // Evaluate computation
}
evaluate(new_comp); // Evaluate oldest computation
あなたの「DONE」フラグは、computers.length === 0 の場合になります。そして、それは上記のコードで自然に処理されます。n.on('message', handler.. に計算が残っていないときはいつでも、結果処理関数を呼び出すことができます。
結果を処理するには、単純な for ループを使用します。
function process_results() {
if(results.length > 0)
for(x in results)
console.log("New result: "+x);
}