Firebase dataRef.transaction()返回错误的快照

时间:2014-04-28 14:18:10

标签: firebase

我想在用户点击#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()错了吗?

请帮忙。

1 个答案:

答案 0 :(得分:1)

不幸的是,基于@Kato的复制,我认为这是基于我们当前实现的预期行为。

基本上,如果您快速执行多个事务(或者当您离线时),我们最终将它们一起批处理并作为单个批处理执行它们,并且每个事件获得的最终快照将是所有这些都跑完后的最终快照。

我知道这可能并不总是理想的。我们将研究是否可能在将来改变这种行为。