1

我有一个工作队列,它等待项目并在它们进入时对其进行处理。这是一个简化版本,它创建 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 次。

这是一个错误吗?

4

0 回答 0