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');

これは同じコードのフィドルです。ただし、これを実行すると、作業は予想される 3 回ではなく 4 回実行され、'WORKER2' は常に 2 回処理されます (コンソールを参照)。firebaseを開くと、同じことがわかります。

これには簡単な修正/回避策があります。作業リスナーから「limit(1)」を単に省略します。

workers.on('child_added', function (snapshot) {

その変更で実行すると、ワーカーは期待どおりに 3 回実行されます。

これはバグですか?

4

0 に答える 0