我想在用户点击#div1或#div2时为其分配一个增量编号。来自不同设备的多个用户可以使用以下代码获得后续号码:
$("#div1").click(function(event) {
doBtn();
}
$("#div2").click(function(event) {
doBtn();
}
function doBtn() {
counterRef.transaction( function(currentData) {
if (currentData === null) {
return 1;
} else {
// increase the counterRef by 1
return currentData + 1;
}
}, function(error, committed, snapshot) {
if (error) {
} else if (!committed) {
} else {
// upon counterRef updated successfully, add a child {user: "userId", counter: xxxx} to ListRef
// (xxxx is the increased counter number)
ListRef.push({
user: "userId",
counter: snapshot.val()
});
}
} );
}
counterRef.on('value', function(snapshot) {
console.log( "Current number is " + snapshot.val() );
}
ListRef.on('child_added', function(snapshot) {
console.log( "Your number is " + snapshot.val().counter );
}
但是,如果用户点击相同的按钮(或者快速点击#div1
和#div2
),他们将获得以下结果:
当前的数字是1 目前的数字是2 目前的数字是3 目前的数字是4 目前的人数是5 目前的数字是6 目前的数字是7 目前的数字是8
您的电话号码是1 你的电话号码是3 你的电话号码是3 你的电话号码是4 你的号码是5 你的电话号码是6 你的电话号码是8 你的电话号码是8
似乎function(error, committed, snapshot)
中的快照值在增加时无法从counterRef
获取并发值。
我使用.transaction()
错了吗?
请帮忙。
答案 0 :(得分:1)
不幸的是,基于@Kato的复制,我认为这是基于我们当前实现的预期行为。
基本上,如果您快速执行多个事务(或者当您离线时),我们最终将它们一起批处理并作为单个批处理执行它们,并且每个事件获得的最终快照将是所有这些都跑完后的最终快照。
我知道这可能并不总是理想的。我们将研究是否可能在将来改变这种行为。