2013-02-03 57 views
3

我想實現一個堆棧(隊列),許多用戶可以將()推入,並且可以以FILO方式彈出()。Firebase pop()與push()相反嗎?

是否有相當於pop()方法檢索/刪除列表的最後一項?

例如:

var popRef = firebaseRef.pop(); 
+0

你能否重新解釋這個問題,這樣會更清楚? – salexch

+0

@salexch,當然,但哪一部分不清楚? – Miro

+0

堆棧式應用程序 – salexch

回答

6

這是非常可行的,但稍微棘手。由於您將有多個用戶嘗試刪除項目,因此您必須處理多個用戶試圖刪除相同項目的情況(這實際上是一個分佈式系統問題)。想必你只想讓一個用戶成功。解決方案是使用事務來確保只有一個用戶可以成功刪除特定項目。

我們已經在github上一個「工作隊列」的例子,非常類似於你在找什麼:https://github.com/firebase/firebase-work-queue

它和你要的之間最大的區別是,它的FIFO,而不是先進後出。要改變它是先進後出,你要修改這條線從workqueue.js:

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

的.startAt()有告訴它抓住從開始列表的第一項(即最古老的物品)。要獲得列表中的最後一項(即最新項目),您可以將「startAt()」更改爲「endAt()」,或者完全省略「startAt()」(默認情況下我們將獲得最後一項)。

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; 
    }); 
+0

我可能使用了錯誤的解釋,我的意思是說第一個來得到最後的數據 - FILO。對不起,我將編輯帖子。 – Miro

+0

正如我在其他評論中提到的那樣,它是[Firebase](http://firebase.com)相關問題,而不是JavaScript一個:)謝謝! – Miro

+0

@Miro firebaseRef將消息保存在數組中,您可以訪問底層數組並執行所需的所有操作。 –