我有一个工作队列,它等待项目并在它们进入时对其进行处理。这是一个简化版本,它创建 3 个工作并处理它们:
firebaseRef = '_fiddle1';
data = new Firebase('https://fiddles.firebaseIO.com/HQyac/' + firebaseRef + '/data');
workers = new Firebase('https://fiddles.firebaseIO.com/HQyac/' + firebaseRef + '/workers');
// clear all data
data.remove();
workers.remove();
// listen for new work
workers.limit(1).on('child_added', function (snapshot) {
var workerName = snapshot.name();
var workerVal = snapshot.val();
console.log('INVOKED: ', workerVal + ' [' + workerName + ']');
// increment counter as example work
data.child(workerVal).transaction(function (tran) {
return tran + 1;
}, function (error, committed, snapshot2) {
console.log('COMMITTED: ', snapshot2.name() + ' = ' + snapshot2.val() + ' [' + workerName + ']');
workers.child(workerName).remove();
}, false);
});
// create work
workers.push('WORKER1');
workers.push('WORKER2');
workers.push('WORKER3');
这是相同代码的小提琴。但是,如果您运行它,工作将执行 4 次,而不是预期的 3 次,“WORKER2”总是被处理两次(参见控制台)。如果你打开 firebase,你可以看到同样的结果。
对此有一个简单的修复/解决方法:只需从工作侦听器中省略“limit(1)”:
workers.on('child_added', function (snapshot) {
如果您使用该修改运行它,则工作人员会按预期运行 3 次。
这是一个错误吗?