阅读文件后如何取消交易?
How can I cancel a transaction once I read documents?
我正在尝试构建一个游戏,只有当他们有足够的金币时,我才会同时删除 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.abort()
而不是 t.rollback()
,但它不被称为函数..
- 有没有办法停止交易?
- 这是从交易中删除余额的好方法吗?
尝试使用 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);
};
我正在尝试构建一个游戏,只有当他们有足够的金币时,我才会同时删除 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.abort()
而不是 t.rollback()
,但它不被称为函数..
- 有没有办法停止交易?
- 这是从交易中删除余额的好方法吗?
尝试使用 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);
};