我有一个类的两个实例MyWorker
。我将start
这些对象的方法绑定到start
事件。并且有一系列要处理的项目。emit
我为每个对象和start
事件分配一个项目。
for (i = 0; i < objs.length; i += 1) {
objs[i].item = items.shift();
}
self.emit('start');
start 方法中有一些异步 IO 作业,所以一切正常。并且在处理完对象后会发出一个done
事件。该done
方法检查是否items.length > 0
. 如果是,它将下一个项目分配给同一对象并发出start
事件。
MyClass.prototype.done = function (data) {
var self = this;
data.object.item = items.shift();
self.emit('start');
}
现在,考虑一个 IO 等待时间非常短或事件没有 IO 操作的情况。一切同步进行。在这种情况下,done
甚至在下一个对象获得事件之前就会触发该start
事件。将done
分配新对象并再次发射start
。这就是造成问题的原因。的start
第二个对象现在将被调用两次。
知道如何解决这个问题吗?