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

Get a value from Firebase and update it with the current value + 1

是的,标题有问题。一些信息这就是我的 Firebase 数据库的样子:

这是当前代码:

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
}

基本上,我想要的是将 qty + 1 returned 到函数 updateQTY

也许我必须采用完全不同的方式,但这没关系,我只是不知道该怎么做。我知道实际获取当前数量的函数必须 return 它,但后来我不明白如何在另一个函数中捕获它。

你不能return一个不会立即可用的值,所以currentQTY需要return一个承诺对于新数量;然后,在 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);
}

如果可以使用async/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.