在for循环中等待事件函数

时间:2019-03-15 13:29:06

标签: javascript node.js asynchronous async-await

我需要在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()函数被调用?

1 个答案:

答案 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
            }
        });
    });
}