在我的应用中集成Firebase,目前正在探索如何使用事务生成唯一的用户ID。
官方Firebase网站(http://jsfiddle.net/katowulf/5ESSp/)上引用的相关演示(https://www.firebase.com/docs/web/examples.html)似乎存在问题:
点击"增量"按钮反复且足够快似乎导致计数器递增但是然后并非所有相应的记录似乎都在Firebase中被记录。因此,如果两个人同时注册,那是不是会搞砸什么?
以下是jsfiddle上提供的代码:
var fb = new Firebase("https://katowulf-examples.firebaseio.com/incid/");
// monitors changes and updates UI
fb.child('counter').on('value', updateDiv);
fb.on('value', updatePre);
// creates a new, incremental record
$('#inc').on('click', incId);
// resets the data
$('#clear').on('click', function() {
fb.remove();
});
// attempts to create any id you put in
$('#customButton').on('click', function() {
addRecord($('#custom').val());
});
var errId = 0;
// creates a new, incremental record
function incId() {
// increment the counter
fb.child('counter').transaction(function(currentValue) {
return (currentValue||0) + 1
}, function(err, committed, ss) {
if( err ) {
setError(err);
}
else if( committed ) {
// if counter update succeeds, then create record
// probably want a recourse for failures too
addRecord(ss.val());
}
});
}
// creates new incremental record
function addRecord(id) {
setTimeout(function() {
fb.child('records').child('rec'+id).set('record #'+id, function(err) {
err && setError(err);
});
});
}
// for demo purposes
function updateDiv(ss) {
$('div').text(ss.val()||0);
$('#custom').val('rec'+(parseInt(ss.val(), 10)+1));
}
// for demo purposes
function updatePre(ss) {
$('#data').text(JSON.stringify(ss.val(), null, 2));
}
// for demo purposes
function setError(msg) {
var id = ++errId;
$('body').append('<p id="err'+id+'">'+msg+'</p>');
setTimeout(function() { $('#err'+id).fadeOut(); }, 2500);
}
不确定发生了什么以及是否可以解决这个问题?
编辑:我添加了一个&#34; for&#34;循环来模拟来自客户端的2个事务:function incId() {
for (i = 0; i < 2; i++) {
// increment the counter
fb.child('counter').transaction(function(currentValue) {
return (currentValue||0) + 1
}, function(err, committed, ss) {
if( err ) {
setError(err);
}
else if( committed ) {
// if counter update succeeds, then create record
// probably want a recourse for failures too
addRecord(ss.val());
}
});
}}
结果:
{ &#34; counter&#34;:2, &#34;记录&#34;:{ &#34; rec2&#34;:&#34;记录#2&#34; } } 错误:PERMISSION_DENIED
2个事务以相同的值提交,因此1个事务在途中丢失,因为它被拒绝作为重复键。使用两种不同的浏览器时似乎不会发生这种情况。
所以只有当&#34;同时&#34;交易使用相同的Firebase对象?