アイテムを待機し、アイテムが入ってくると処理するワーカー キューがあります。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');
これは同じコードのフィドルです。ただし、これを実行すると、作業は予想される 3 回ではなく 4 回実行され、'WORKER2' は常に 2 回処理されます (コンソールを参照)。firebaseを開くと、同じことがわかります。
これには簡単な修正/回避策があります。作業リスナーから「limit(1)」を単に省略します。
workers.on('child_added', function (snapshot) {
その変更で実行すると、ワーカーは期待どおりに 3 回実行されます。
これはバグですか?