从Firebase获取一个值并用当前值更新+ 1
问题描述:
所以是的标题有问题。有一点信息,这是我的火力地堡的数据库是什么样子:从Firebase获取一个值并用当前值更新+ 1
这是当前的代码:
export function updateQTY(barcode) {
database.ref('items/' + barcode).update({
qty: currentQTY(barcode)
})
}
export function currentQTY(barcode) {
database.ref('items/' + barcode).once('value').then(function(snapshot) {
var qty = snapshot.val().qty
console.log(qty)
})
return qty + 1
}
基本上,我想是的数量+ 1返回到功能updateQTY
。
Maby我必须做一个完全不同的方式,但没关系,我只是不明白该怎么做。我知道实际获得当前数量的函数必须返回它,但是我不明白如何在其他函数中捕获它。
答
您无法返回一个无法立即获得的值,因此currentQTY
需要返回一个承诺作为新数量;然后,在updateQTY
中,等待该承诺履行,然后然后更新数据。
export function updateQTY(barcode) {
return currentQTY(barcode)
.then(qty => database.ref('items/' + barcode).update({qty}));
)
export function currentQTY(barcode): Promise<number> {
return database.ref('items/' + barcode).once('value')
.then(snapshot => snapshot.val().qty + 1);
}
如果你可以使用异步/ AWAIT:
export async function updateQTY(barcode) {
const qty = await currentQTY(barcode);
database.ref('items/' + barcode).update({qty}));
)
甚至
export async function updateQTY(barcode) {
database.ref('items/' + barcode).update({qty: await currentQTY(barcode)});
)
但是,你能做到这一点更容易,更稳健与交易:
export function updateQTY(barcode) {
return database.ref('items/' + barcode).transaction(data => {
data.qty++;
return data;
});
}
或者你喜欢
export function updateQTY(barcode) {
return database.ref(`items/{$barcode}/qty`).transaction(qty => qty++);
}
使用事务的优点是,它可以正确处理多个用户试图同时更新数据的情况。欲了解更多信息,请参阅documentation。