Transcation updateFunction参数为null

时间:2015-11-07 03:41:20

标签: firebase

我无法让交易工作并需要一些帮助

我使用FB应用仪表板创建了以下数据库结构:   闪烁热-528     测试       设置:"你好"

我可以在仪表板中看到数据存在:

enter image description here

然后我做了:

var settingsRef=new Firebase('https://flickering-heat-528.firebaseio.com/test/settings');

settingsRef.transaction(function(json) {
    alert(json);
}, function(error, committed, snapshot) {
}, true);

请参阅jsfiddle

但警报总是“无效”。为什么??

1 个答案:

答案 0 :(得分:1)

Firebase中的交易回调可能会多次触发。要理解为什么,请看看如何执行此操作。

让我们从这个逻辑开始:如果当前值为null,您希望它变为" byebye"。

settingsRef.transaction(function(current) {
    if (!current) {
       return "byebye";
    }
    return current;
}, function(error, committed, snapshot) {
}, true);

Firebase客户端还不知道您的settings节点的值,因此它会假设:当前值为null来调用您的事务。然后,它会发送给您的值和您返回Firebase服务器的值的组合。

Firebase服务器会将数据库中的当前值("hello")与其提供给您的值进行比较,并确定它们不匹配("hello" <> null)。因此它将当前值("hello")发送回客户端。

Firebase客户端再次调用您的回调。这次它传递了从服务器("hello")听到的值:

settingsRef.transaction(function(current) {
    if (!current) {
       return "byebye";
    }
    return current + "!";
}, function(error, committed, snapshot) {
}, true);

所以现在你的函数返回"hello!"。 Firebase会再次发送它为您提供的值以及您返回给服务器的值:"hello""hello!"。服务器执行与以前相同的比较,如果数据库中的值仍为"hello" ,则设置您指定的新值"hello!"

这称为比较和设置操作,并解释了为什么您的回调可能被多次调用。