2

我有一个类的两个实例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第二个对象现在将被调用两次。

知道如何解决这个问题吗?

4

0 回答 0