我在我的应用中使用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
执行回弹,没有错误,但快照值错误。当我签入Forge时,我可以确认该值尚未更新。奇怪... 这里有另一个奇怪的事情:当我几次非常快地点击按钮时,实际上正在提交某些事务。 有没有人经历过类似的行为或对此有解释?我的代码似乎是正确的......还是没有?
答案 0 :(得分:1)
问题不在于transaction()本身,而在于我绑定了'price'的父对象 - 拍卖到我的本地范围变量:
angularFire(travelBidsFirebaseRef + "/auction/" + $scope.auctionId, $scope, 'auction', {});
在触发更新'price'的交易之前,我更新了绑定的Auction对象的另一个属性 - 'endDate':
$scope.auction.endDate = new Date(millis).toUTCString();
这行代码触发整个Auction对象的更新,包括'price'。我预计只会更新'endDate'属性。
这个代码之王创造了竞争条件,我的'价格'更新在提交后立即被覆盖,并且回弹不是我所期望的。
了解与FireBase同步的数据究竟是什么非常重要,并且不要创建对同一数据的多个引用 - 当应用变得更加复杂时,它可能会让您感到...