【问题标题】:Firebase transaction does not update actual value in the Firebase DBFirebase 事务不会更新 Firebase 数据库中的实际值
【发布时间】:2013-08-07 10:43:24
【问题描述】:

我在我的应用程序中使用 AngularJS 和 FireBase。当用户按下按钮时,我想将拍卖物品的价格提高 0.01 美元,并且在它被提交到 FireBase 数据库之后 - 从用户的余额中扣除 1.00 美元。我为此使用 FireBase transaction(),但该项目的值未在 FireBase DB 中更新:

$scope.auctionPriceRef = travelBidsFirebaseRef.child('auction/' + $scope.auction.id + '/price');
$scope.auctionPriceRef.transaction(function(currentValue) {
console.log("Current val + 0.01: " + (currentValue + 0.01));
return currentValue + 0.01;
}, function(error, committed, snapshot) {
if (error) {
    console.error("Error increasing auction price: " + error);
}
if (committed) {
    console.log("Successfully increased auction price to: " + snapshot.val());
    $rootScope.authUser.balance -= 1.0;
}
});

此代码执行没有错误,我可以在控制台看到以下输出(商品的初始价格为 1.00):

Current val + 0.01: 1.01
Successfully increased auction price to: 1

collback被执行,没有错误但是快照值错误。当我签入 Forge 时,我可以确认该值尚未在那里更新。奇怪的... 这里还有另一件奇怪的事情:当我非常快速地多次单击按钮时,实际上正在提交一些事务。 有没有人经历过类似的行为或对此有解释?我的代码似乎是正确的……还是不正确?

【问题讨论】:

  • 我只是把这段代码放到了小提琴中,几乎一字不差,它就像宣传的那样工作:jsfiddle.net/katowulf/N2WZE
  • @Kato 你是对的,真正的问题不在于事务,而在于更新相同数据的代码的其他部分。我回答了我自己的问题,见下文。

标签: javascript angularjs firebase


【解决方案1】:

问题不在于 transaction() 本身,而在于我已将“价格”的父对象绑定到我的本地范围变量:

angularFire(travelBidsFirebaseRef + "/auction/" + $scope.auctionId, $scope, 'auction', {});

就在触发更新“价格”的交易之前,我更新了另一个属性 - 绑定拍卖对象的“结束日期”:

$scope.auction.endDate = new Date(millis).toUTCString();

这行代码触发整个拍卖对象的更新,包括“价格”。我预计只会更新“endDate”属性。

这个代码之王创建了竞速条件,其中我的“价格”更新在提交后立即被覆盖,并且回退返回不是我所期望的。

了解与 FireBase 同步的确切数据非常重要,并且不要创建对同一数据的多个引用 - 当应用程序变得更加复杂时,它可能会让您陷入困境.

【讨论】:

  • 很好 - 我们正在努力在 AngularFire 的后续版本中改进这种行为,我们将只更新实际更改的字段而不是整个对象。
猜你喜欢
  • 1970-01-01
  • 2023-03-06
  • 2017-09-04
  • 2021-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-26
  • 1970-01-01
相关资源
最近更新 更多