3

多くのユーザーが FILO 方式で push() でき、多くのユーザーが pop() できるスタック (キュー) を実装したいと考えています。

pop()リストの最後の項目を取得/削除するメソッドに相当するものはありますか?

例えば:

var popRef = firebaseRef.pop();
4

2 に答える 2

6

これは非常に実行可能ですが、少し注意が必要です。複数のユーザーがアイテムを削除しようとするため、複数のユーザーが同じアイテムを削除しようとする場合に対処する必要があります (これは実際には分散システムの問題です)。おそらく、1 人のユーザーだけを成功させたいと考えています。解決策は、トランザクションを使用して、1 人のユーザーだけが特定のアイテムを正常に削除できるようにすることです。

探しているものと非常によく似た「ワーク キュー」の例が github にあります: https://github.com/firebase/firebase-work-queue

それとあなたが求めたものとの大きな違いは、FILO ではなく FIFO であることです。これを FILO に変更するには、workqueue.js から次の行を変更します。

queueRef.startAt().limit(1).on("child_added", function(snap) {

そこにある .startAt() は、リストの先頭から最初の項目(つまり、最も古い項目) を取得するように指示します。リストの最後の項目 (つまり、最新の項目) を取得するには、"startAt()" を "endAt()" に変更するか、"startAt()" を完全に省略できます (デフォルトでは、最後の項目が取得されます)。

于 2013-02-03T19:09:06.053 に答える
0

FIFO である「先着順」が必要なので、必要ありませんがpop()unshift()JavaScript で利用できます。

// Performs a dequeue: gets the 0-index item and removes it
// from the original array
var popRef = firebaseRef.unshift();

FILO を実行するには、pop().

FireBase の更新:

  // Get a reference to the root of the chat data.
  var messagesRef = new Firebase('https://example37192028.firebaseio-demo.com/');
  var tokens = [];
  // When the user presses enter on the message input, write the message to firebase.
  $('#messageInput').keypress(function (e) {
      if (e.keyCode == 13) {
          var name = $('#nameInput').val();
          var text = $('#messageInput').val();
          tokens.push(messagesRef.push({name:name, text:text}));
          $('#messageInput').val('');
      } else if (e.keyCode == 32) {
          // Removing from the stack on spacebar
          var token = tokens.pop();
          token.remove();
          $('#messageInput').val('');
      }
  });

  // Add a callback that is triggered for each chat message.
  messagesRef.on('child_added', function (snapshot) {
      var message = snapshot.val();
      $('<div/>').text(message.text).prepend($('<em/>').text(message.name+': ')).appendTo($('#messagesDiv'));
      $('#messagesDiv')[0].scrollTop = $('#messagesDiv')[0].scrollHeight;
  });
  messagesRef.on('child_removed', function (snapshot) {
      var message = snapshot.val();
      $('<div/>').text('removed:' + message.text).prepend($('<em/>').text(message.name+': ')).appendTo($('#messagesDiv'));
      $('#messagesDiv')[0].scrollTop = $('#messagesDiv')[0].scrollHeight;
  });
于 2013-02-03T14:32:42.437 に答える