javascript Firebase触发功能交替工作

ss2ws0br  于 2023-03-16  发布在  Java
关注(0)|答案(2)|浏览(110)

我编写了这个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.有时它真实的更新并且工作良好。

nwlqm0z1

nwlqm0z11#

原因是您必须链接承诺(因此在每个链接步骤返回一个承诺)。
以下方法应该有效:

export const updateTotalAnswersCounts = functions.database
.ref('/CurrentGame/answers/{aid}').onWrite((change, context) => {
    const collectionRef = change.after.ref.parent;
    let total = 0;

    return 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())
            }
        })

    }).then(() => {
        const updates = {}
        updates['/totalAnswersCount'] = total
        return firebase.ref('/CurrentGame').update(updates)
    }).catch(error => {
        console.log(error);
        //Error treatment
    });

});

我建议你看看道格·史蒂文森关于这个主题的视频:
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秒后更新)是在云函数中不返回承诺时的典型行为。

qxgroojn

qxgroojn2#

我建议的一个更改是使用change中的值,并将总和添加到您的总答案计数中。
例如:total = total+(newvalue-oldvalue);
这将保存您从“once”操作加载所有值的麻烦,如果您的数据增长,这将是非常昂贵的。
最后,你选择其他工作的原因(我怀疑)可能是因为承诺,它们是从你的“一次”操作中执行的。希望这对你有帮助。

相关问题