gpt4 book ai didi

javascript - firebase 事务和 if-then-else 行为

转载 作者:行者123 更新时间:2023-11-30 14:25:24 25 4
gpt4 key购买 nike

我的要求有一些变化:

不仅要创建/请求/取消整个报价,还要对报价的详细信息执行一些操作:

这是 activeOffers 列表中的一个报价:

activeOffers
-LKohyZ58cnzn0vCnt9p
details
direction: "city"
seatsCount: 2
timeToGo: 5
uid: "-ABSIFJ0vCnt9p8387a" ---- offering user

用户应该能够“请求座位”,如果请求成功,Offer 记录应该如下所示:

activeOffers
-LKohyZ58cnzn0vCnt9p
details
direction: "city"
seatsCount: 1 ----- reduced count
timeToGo: 5
uid: "-ABSIFJ0vCnt9p8387a"
deals
-GHFFJ0vCnt9p8345b ----- the userId of asking user
seatsCount: 1
status: "asked"

但是我在执行如下所示的源代码后遇到了 3 个问题:

(如上图offer有2个席位,用户要求1个席位)

  1. 在我的日志中执行后,我同时看到“将座位数减少 1”和“没有足够的座位”...即:“if-then-else”的“then”和“else”部分: o

  2. 函数结果为 [] - 即未创建交易。

  3. 我不确定如何执行 TODO: 部分 - 使用询问 userId 作为 KEY 在 dealsRef 下添加子项(新交易对象),因为我认为我不需要自动生成的 key 。

输入数据具有以下结构:

data
"uid": "-GHFFJ0vCnt9p8345b", ----- the userId of asking user
"id": "-LKohyZ58cnzn0vCnt9p", ----- the id of offer
"details":
"seatsCount": 1

这是我的代码:

dealSeats = function(data) {

const TAG = '[dealSeats]: ';

var details = data.details;
var info = data.info;

var entryRef = db.ref('activeOffers/' + data.id);
var entryDetailsRef = entryRef.child('details');
var seatsCountRef = entryDetailsRef.child('seatsCount');

var success = false;
return seatsCountRef.transaction((current)=>{
var value = current;
if (value >= details.seatsCount) {
success = true;
value = value - details.seatsCount;
console.log(TAG + 'Reducing seats count by ' + details.seatsCount);
} else {
console.log(TAG + 'Not enought seats');
}
return value;
})
.then(()=>{
var deal = [];
if (success) {
console.log(TAG + 'Succes');
deal.seatsCount = details.seatsCount;
deal.status = 'asked';
// TODO: here should add the new deal to dealsRef
return deal;
} else {
console.log(TAG + 'Failure');
return deal;
}
})
}

如您所见 - 我不确定检查交易是否成功的正确方法是什么...

最佳答案

reference documentation for DatabaseReference.transaction says :

... until your write succeeds without conflict or you abort the transaction by not returning a value from your update function.

因此,中止事务的方法是不从更新函数返回任何值。这意味着整个第一个 block 可以简化为:

seatsCountRef.transaction((current)=>{
if (current >= details.seatsCount) {
return value - details.seatsCount;
}
})

现在它要么返回新值,要么什么都不返回。后者将使 Firebase 中止交易。

要检测交易的最终输出,我发现使用完成回调(而不是 Promise)最简单,因为它会在一次调用中为您提供所有参数:

seatsCountRef.transaction((current)=>{
if (current >= details.seatsCount) {
return value - details.seatsCount;
}
}, function(error, committed, snapshot) {
if (error) {
console.log('Transaction failed abnormally!', error);
} else if (!committed) {
console.log('We aborted the transaction, because there are not enough seats.');
} else {
console.log('Seat count updated');
}
})

第一个错误情况的最常见原因是必须过于频繁地重试交易,这意味着有太多用户试图同时申请席位。此处的典型解决方案是后退,即让客户端稍后重试。

关于javascript - firebase 事务和 if-then-else 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52023800/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com