我认为一个不错的方法可能是递归调用您的评估函数,直到所有计算完成。使用队列进行计算并以 FIFO 方式处理它们。
var computations = [];
您需要放弃 n.once('message' 并在评估函数之外定义一个 n.on('message' 处理程序。您收到的每个“消息”都与您的评估数据类型匹配(我们称之为“结果”) . 然后您将该结果保存在结果的 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”标志将在 computes.length === 0 时出现。这自然会使用上面的代码自行处理。任何时候你在 n.on('message', handler.. 中剩下 0 个计算,你都可以调用你的结果处理函数:
要处理您的结果,它是一个简单的 for 循环。
function process_results() {
if(results.length > 0)
for(x in results)
console.log("New result: "+x);
}