我编写了这个firebase函数,当数据被添加时触发,它汇总子值并更新总值字段。
export const updateTotalAnswersCounts = functions.database
.ref('/CurrentGame/answers/{aid}').onWrite((change, context) => {
var collectionRef = change.after.ref.parent;
let total = 0;
collectionRef.once('value',(snapshot)=>{
console.log('snapshot',snapshot.val())
snapshot.forEach((childSnapshot)=>{
if(childSnapshot.val()!=null){
console.log('childSnapshot',childSnapshot.val())
total+=Number(childSnapshot.val())
}
return false;
})
const updates = {}
updates['/totalAnswersCount'] = total;
firebase.ref('/CurrentGame').update(updates)
})
return true;
});
当我添加新值到'answers'节点时,函数trigger工作,然后它获取所有数字(在此照片中为1+2+11),然后它将totalAnswersCount更新为sum = 14。
该加法操作
addAnswer() {
let answer = 3;
let userInfo = {
uid: this.uid,
gid: '1',
qid: '2',
aid: '3'
}
const answer_ref = firebase.database().ref(`CurrentGame/answers/${answer}`);
const users_answers_ref = firebase.database().ref(`GameQuestionStats/${this.user.uid}/${userInfo.qid}`);
// Return the promise from countRef.transaction() so our function
// waits for this async event to complete before it exits.
return answer_ref.transaction((current) => {
return (current || 0) + 1;
}).then(() => {
return users_answers_ref.set(userInfo,{merge:true})
});
}
此Firebase函数交替工作
1.当我第一次加载应用程序时,它节点更新,而不做任何更新。
1.有时它具有延迟并且在3-4秒之后更新。
1.有时它真实的更新并且工作良好。
2条答案
按热度按时间nwlqm0z11#
原因是您必须链接承诺(因此在每个链接步骤返回一个承诺)。
以下方法应该有效:
我建议你看看道格·史蒂文森关于这个主题的视频:
https://www.youtube.com/watch?v=7IkUgCLr5oA&t=515s
https://www.youtube.com/watch?v=652XeeKNHSk
https://www.youtube.com/watch?v=d9GrysWH1Lc&t=4s
请注意,第2种情况(它有延迟,并在3-4秒后更新)是在云函数中不返回承诺时的典型行为。
qxgroojn2#
我建议的一个更改是使用change中的值,并将总和添加到您的总答案计数中。
例如:
total = total+(newvalue-oldvalue);
这将保存您从“once”操作加载所有值的麻烦,如果您的数据增长,这将是非常昂贵的。
最后,你选择其他工作的原因(我怀疑)可能是因为承诺,它们是从你的“一次”操作中执行的。希望这对你有帮助。