javascript - 原子地增加 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 异常”。
解决方案
最后,考虑到@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;
推荐阅读
- mongoose - 适配器类型“mongoose”不支持字段类型“CloudinaryImage”
- r - 我应该使用哪种旋转方法进行因子分析?
- c# - 从对象 C# 获取参数名称列表
- angular - 如何删除对primeng列表框元素的点击,仅使用复选框属性
- debugging - 如何在 python grpc 服务器中启用二进制日志?
- telegram-bot - 如何知道 MediaGroup 电报中的消息数或最后一条消息
- selenium-chromedriver - 如何使用 Selenium Python 检查伪元素 ::after 是否存在
- flutter - 如何通过快速滑动使列表视图不“跳过”项目?
- c++ - 如何在 C++ 编译时生成查找表?
- javascript - 如何创建一个递增日期的数组?