从Firebase获取一个值并用当前值更新+ 1

问题描述:

所以是的标题有问题。有一点信息,这是我的火力地堡的数据库是什么样子:从Firebase获取一个值并用当前值更新+ 1

firebase database

这是当前的代码:

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