Je pense qu'une bonne solution serait d'appeler votre fonction evaluate de manière récursive jusqu'à ce que tous les calculs soient terminés. Utilisez une file d'attente pour vos calculs et traitez-les de manière FIFO.
var computations = [];
Vous devriez abandonner le n.once('message' et, en dehors de votre fonction evalutate, définir un gestionnaire n.on('message'. Pour chaque "message" que vous recevez et qui correspond à votre type de données d'évaluation (appelons-le "résultat"). Ensuite, vous enregistrez ce résultat dans une file FIFO de résultats. Après quoi, on vérifie s'il y a d'autres calculs et on appelle à nouveau evaluate. Si vous le souhaitez, vous pouvez nettoyer ce processus pour séparer le calcul le plus ancien dans la fonction d'évaluation.
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.
});
Avant l'appel de evaluate, vous devez pousser votre calcul dans la file d'attente, et envoyer le plus ancien à evaluate.
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
Votre drapeau "DONE" sera activé lorsque computations.length === 0. Et cela se fera naturellement avec le code ci-dessus. Chaque fois qu'il vous reste 0 calcul dans le handler n.on('message',..) vous pouvez appeler votre fonction de traitement des résultats :
Pour traiter vos résultats, il s'agit d'une simple boucle for.
function process_results() {
if(results.length > 0)
for(x in results)
console.log("New result: "+x);
}