首页 > 解决方案 > 原子地增加 Firebase 实时数据库中的共享计数器

问题描述

我需要减少存储在 Firebase 实时数据库中的计数器(名为credits )。

为了减少计数器,我这样做:

var ref = admin.database().ref('licenseCredits/' + name + '/credits');

ref.transaction( (value) => {

  if (value === null) {
    return 0;
  } else if (typeof value === 'number') {

    return value - 1;
  } else {
    console.log('The counter has a non-numeric value: '); 
  }
});

credits字段正在正确减少。我将此代码放入可调用函数中,但我不知道如何将递减的值返回给调用者。如果我只是返回 ref.transaction 结果,我会得到一个“未处理的 RangeError 异常”。

标签: javascriptfirebasefirebase-realtime-databasetransactions

解决方案


最后,考虑到@chris 的答案,我找到了解决问题的方法。

我使用了一个使用 'kew' 库实现的 javascript 承诺。

这是工作代码:

   var qTrans = Q.defer();

    var ref = admin.database().ref('licenseCredits/' + name + '/credits');
    var credits = 0;



    ref.transaction( (value) => {

      if (value === null) {
        // the counter doesn't exist yet, start at one
        return 1;
      } else if (typeof value === 'number') {
        // increment - the normal case
        return value + 1;
      } else {
        // we can't increment non-numeric values
        console.log('The counter has a non-numeric value: ' + JSON.stringify(value));
        // letting the callback return undefined cancels the transaction
      }
    }, (error, committed, snapshot) => {
        if (error) {
            console.log('Transaction failed abnormally!', error);
            qTrans.reject(error);

        } else if (!committed) {
            console.log('We aborted the transaction.');
            qTrans.reject(error);

        } else {
            console.log('Success!');
            console.log("Credit data: ", snapshot.val());
            qTrans.resolve(snapshot.val());

        }
    });

    return qTrans.promise;

推荐阅读