我需要在for循环内等待,直到调用了事件函数。
我正在等待来自let worker = cluster.fork();
的子流程的响应
我正在用数组中的特殊消息回答每个子进程。因此,如果for循环持续进行而没有等待,我可能会向其发送错误的数据(下一个设备的数据等等)。
for(var i=0;i<data.length;i++) {
if(connected_devices.includes(data[i].deviceID) == false) {
let worker = cluster.fork();
connected_devices.push(data[i].deviceID);
}
await worker.on('message', function (msg) { // wait untill this function is called then continue for loop
worker.send({ device: data[i].deviceID, data[i].name});
}
}
所以我的问题是如何等待我的worker.on()
函数被调用?
答案 0 :(得分:2)
worker.on
函数被依次调用并完成。 worker.on
没有什么异步的。但是,它正在注册一个可以通过其他方式调用的功能,大概是在工作人员将消息提交回集群时。
除了细节之外,worker.on
函数提交匿名函数以供以后调用。如果担心的是传递给该匿名函数的数据可能会受到迭代的影响,那么我认为您的代码看起来不错。
您如何声明worker
变量可能存在问题,因为它是在if
条件的封闭范围内定义的。但是,您要查询的代码应具有以下功能:
// Stubs for woker.on and worker.send
const stubWorker = {
on: (type, func) => {
console.log('worker.on called');
setTimeout(func, 1000);
},
send: (obj) => {
console.log(`Object received: ${JSON.stringify(obj)}`);
}
};
const cluster = {
fork: () => stubWorker
};
const data = [
{ deviceId: 0, name: 'Device Zero' },
{ deviceId: 1, name: 'Device One' },
{ deviceId: 2, name: 'Device Two' },
{ deviceId: 3, name: 'Device Three' }
];
for (let i = 0; i < data.length; ++i) {
// Removed if condition for clarity
const worker = cluster.fork();
worker.on('message', function () {
worker.send({
device: {
id: data[i].deviceId,
name: data[i].name
}
});
});
}