Javascript Firebase事务多次更新
我正在尝试在我的应用程序中创建一个用户评级系统,其中一个用户可以对另一个用户进行1-5星级评级,并描述他们的体验。我的平均评级系统有问题,因为我的事务一次只能更新每个文档中的一个表。也许我走错了方向,需要一些建议或帮助 count字段得到可靠的更新,它将像在我的测试中一样递增。要正确计算平均评级是行不通的。我想是因为我试图在一个函数中完成两个事务 db: firebase功能:Javascript Firebase事务多次更新,javascript,firebase,firebase-realtime-database,transactions,google-cloud-functions,Javascript,Firebase,Firebase Realtime Database,Transactions,Google Cloud Functions,我正在尝试在我的应用程序中创建一个用户评级系统,其中一个用户可以对另一个用户进行1-5星级评级,并描述他们的体验。我的平均评级系统有问题,因为我的事务一次只能更新每个文档中的一个表。也许我走错了方向,需要一些建议或帮助 count字段得到可靠的更新,它将像在我的测试中一样递增。要正确计算平均评级是行不通的。我想是因为我试图在一个函数中完成两个事务 db: firebase功能: exports.calculateReputation = functions.database.ref('/repu
exports.calculateReputation = functions.database.ref('/reputation/{userID}/{uniqueID}').onCreate((snap, context) => {
const data = snap.val();
const rating = data[Object.keys(data)].rating;
snap.ref.parent.child('/count').transaction((currentCount) => {
return currentCount + 1;
}, (error, committed, snapshot) => {
if (error) {
console.log('Transaction failed abnormally!', error);
} else if (!committed) {
console.log('We aborted the transaction (because ada already exists).');
} else {
console.log('added!');
console.log('ADD RATING:', rating);
}
var count = snapshot.val();
console.log('COUNT:', count);
snap.ref.parent.child('/rating').transaction((currentRating) => {
var newRating = Math.round( ((rating + currentRating) / count) * 10 ) / 10;
return newRating;
});
});
});
可能更大的问题是,您没有从函数返回一个承诺,该函数在该函数中完成所有异步工作时会解析。@DougStevenson您的意思是将数据返回到.transaction.then()?任何时候处理返回承诺的事情,如transaction(),最终返回的承诺需要考虑到这一点。
exports.calculateReputation = functions.database.ref('/reputation/{userID}/{uniqueID}').onCreate((snap, context) => {
const data = snap.val();
const rating = data[Object.keys(data)].rating;
snap.ref.parent.child('/count').transaction((currentCount) => {
return currentCount + 1;
}, (error, committed, snapshot) => {
if (error) {
console.log('Transaction failed abnormally!', error);
} else if (!committed) {
console.log('We aborted the transaction (because ada already exists).');
} else {
console.log('added!');
console.log('ADD RATING:', rating);
}
var count = snapshot.val();
console.log('COUNT:', count);
snap.ref.parent.child('/rating').transaction((currentRating) => {
var newRating = Math.round( ((rating + currentRating) / count) * 10 ) / 10;
return newRating;
});
});
});