javascript - 阅读文件后如何取消交易?
问题描述
我正在尝试构建一个游戏,只有当他们有足够的金币时,我才会同时删除 2 个用户的余额。一旦我得到所有文件(用户的余额),我正在做一些逻辑并检查新的余额不会小于 0:
const removeGamglingBalanceFor2Users = (
user1, user2, amount, resolve, reject,
) => {
const userDocRef1 = db.collection(DB_USERS).doc(user1.id);
const userDocRef2 = db.collection(DB_USERS).doc(user2.id);
db.runTransaction(
(t) => t.getAll(userDocRef1, userDocRef2).then((docs) => {
const balances = [];
docs.forEach((doc) => {
balances.push(doc.data()[FIELD_BALANCE] - amount);
});
if (Math.min(...balances) < 0){
reject(INSUFFICIENT_FUNDS);
t.rollback();
return;
}
[userDocRef1, userDocRef2].forEach((doc) => {
t.update(doc,
{ [FIELD_BALANCE]: FieldValue.increment(-amount) });
});
}),
).then(() => {
resolve();
}).catch((err) => {
reject(err);
});
};
此代码使用管理 SDK 和服务帐户执行服务器端。
即使条件Math.min(...balances) < 0)
为真,它也会拒绝承诺,但不会被拒绝块捕获。此外,它继续运行并消除平衡。
而不是t.rollback()
我尝试过t.abort()
,但它不被称为函数..
- 有没有办法停止交易?
- 这是从交易中删除余额的好方法吗?
解决方案
尝试使用throw INSUFFICIENT_FUNDS
而不是reject(INSUFFICIENT_FUNDS)
const removeGamglingBalanceFor2Users = (
user1, user2, amount, resolve, reject,
) => {
const userDocRef1 = db.collection(DB_USERS).doc(user1.id);
const userDocRef2 = db.collection(DB_USERS).doc(user2.id);
db.runTransaction(
(t) => t.getAll(userDocRef1, userDocRef2).then((docs) => {
const balances = docs.map(doc => doc.data()[FIELD_BALANCE] - amount)
if (Math.min(...balances) < 0)
throw INSUFFICIENT_FUNDS
[userDocRef1, userDocRef2].forEach((doc) => {
t.update(doc,
{ [FIELD_BALANCE]: FieldValue.increment(-amount) });
});
})
)
.then(() => resolve())
.catch(reject);
};
推荐阅读
- node.js - 用于循环排序的 ejs
- angular - Angular 自定义排序网格列的 Kendo UI
- javascript - (Vue, ChartJS) 从子组件画布上下文为图表创建渐变背景
- java - 如何检查单个tomcat中每个Web应用程序的内存大小?
- javascript - 评估功能不起作用
- macos - 我忘记了我的 Macbook 的管理员名称和密码,并且我的用户帐户已更改为标准,我该如何更改?
- javascript - 将特定年份的周分组为季度
- reactjs - 如何调度值 onChange
- php - 将数据插入数据库 laravel 5.6 关系属于任何数据透视表
- go - 在我从代码创建 Golang 代码后,它没有插入到 BigQuery 的表中