【问题标题】:Cloud Functions -How to Update Multiple RefsCloud Functions - 如何更新多个 Refs
【发布时间】:2021-03-22 18:36:26
【问题描述】:

我必须在几个 refs 处获取数据并在几个 refs 处更新。除了我必须更新的第四个参考 loopArrAtFourthRef 之外,一切正常。它通过循环从第三个获取它的值。 问题是第五个参考在第四个参考之前完成。我是一名 Swift 开发人员,但我无法掌握 Promises,它们对我来说太陌生了。

exports.updateMultipleRefs = functions.https.onCall((data, context) => {

    // ... values from data used in refs

    const fetchFromFirstRef = admin.database()....
    const updateAtSecondRef = admin.database()....
    const runTransactionAtSecondRef = admin.database()....
    const fetchArrDataFromThirdRef = admin.database()....
    const loopArrAtFourthRef = admin.database()....
    const updateFifthRef = admin.database()....

    var arr = [];
    var promises = [];

    var val_1 = 0;
    var val_2 = 0;

    return fetchFromFirstRef
        .once('value')
        .then((snapshot) => {

        if (snapshot.exists()) {

            snapshot.forEach((childSnapshot) => {
                // val_1 += data from each childSnapshot
            });

            return updateAtSecondRef.update({ "val_1":val_1 }).then(()=> {
                return runTransactionAtSecondRef.set(admin.database.ServerValue.increment(1));

            }).then(() => {

                return fetchArrDataFromThirdRef
                    .once('value')
                    .then((snapshot) => {

                    if (snapshot.exists()) {

                        snapshot.forEach((childSnapshot) => {

                            var gameId = childSnapshot.key;
                            arr.push(gameId);
                        });

                    } else {
                        return null;
                    }
                });

            }).then(() => {

                // this is where I'm having the problem, the fifth ref finishes before this does
                for (var i = 0; i < arr.length; i++) {

                    var gameId = arr[i];

                    var promiseRef = loopArrAtFourthRef.child(gameId);

                    promises.push(promiseRef.once('value').then((snap) => {

                        snap.forEach((child) => {
                            // val_2 += data from each child
                        });
                    }));

                    return Promise.all(promises);
                }

            }).then(() => {

                return updateFifthRef.update({ "val_2": val_2 });
            });

        } else {
            return null;
        }
    })
    .catch((error) => {
        console.log('error', error);
        return null;
    });
});

【问题讨论】:

    标签: firebase-realtime-database google-cloud-functions


    【解决方案1】:

    按照this answerthis blog,我只需要创建一个Promises 数组并在外部for 循环完成后运行Promise.all()

    for (var i = 0; i < arr.length; i++) {
    
        var gameId = arr[i];
    
        var promiseRef = loopArrAtFourthRef.child(gameId);
    
        promises.push(promiseRef.once('value').then((snap) => {
    
            snap.forEach((child) => {
                // val_2 += data from each child
            });
        }));
    }
    
    return Promise.all(promises);
    

    【讨论】:

      猜你喜欢
      • 2021-01-09
      • 2020-01-12
      • 2019-05-14
      • 2019-09-14
      • 2019-07-12
      • 1970-01-01
      • 2020-05-31
      • 2023-03-29
      • 2020-06-04
      相关资源
      最近更新 更多