3

我想实现一个堆栈(队列),许多用户可以以 FILO 方式 push() 到并且许多用户可以从中 pop()。

是否有等效于pop()检索/删除列表最后一项的方法?

例如:

var popRef = firebaseRef.pop();
4

2 回答 2

6

这是非常可行的,但有点棘手。由于您将有多个用户尝试删除项目,因此您必须处理多个用户尝试删除同一项目的情况(这实际上是一个分布式系统问题)。大概您只希望一个用户成功。解决方案是使用事务来确保只有一个用户可以成功删除特定项目。

我们在 github 上有一个“工作队列”示例,与您正在寻找的非常相似:https ://github.com/firebase/firebase-work-queue

它与您要求的最大区别在于它是 FIFO 而不是 FILO。要将其更改为 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().

火力基地更新:

  // 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 回答