我想实现一个堆栈(队列),许多用户可以以 FILO 方式 push() 到并且许多用户可以从中 pop()。
是否有等效于pop()
检索/删除列表最后一项的方法?
例如:
var popRef = firebaseRef.pop();
我想实现一个堆栈(队列),许多用户可以以 FILO 方式 push() 到并且许多用户可以从中 pop()。
是否有等效于pop()
检索/删除列表最后一项的方法?
例如:
var popRef = firebaseRef.pop();
这是非常可行的,但有点棘手。由于您将有多个用户尝试删除项目,因此您必须处理多个用户尝试删除同一项目的情况(这实际上是一个分布式系统问题)。大概您只希望一个用户成功。解决方案是使用事务来确保只有一个用户可以成功删除特定项目。
我们在 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()”(默认情况下,我们将获得最后一项)。
你想要一个“先到先得”,它是一个 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;
});