【问题标题】:await in foreach Firebase Functions - For each loop executes after return在 foreach Firebase 函数中等待 - 每个循环在返回后执行
【发布时间】:2021-02-28 21:48:19
【问题描述】:

我有一个 Firebase 实时数据库函数正在运行。问题是foreach循环在return return ref.child("/leaderboard").set(updates);之后执行我知道我必须对 Promise() 做点什么?但不确定如何。任何想法。

const functions = require('firebase-functions');
const admin = require('firebase-admin');

admin.initializeApp();

// Checks the weekly scores and creates a leaderboard entry of the top 3
exports.insertLeaderboard = functions.database.ref('/challenges/weekly/{weeklyId}/scores/{userId}')
    .onWrite(async (change) => {

        const ref = change.after.ref.parent.parent; // reference to the parent
        const leaderboardItems = ref.child("scores").orderByChild('score').limitToLast(3);
        const snapshot = await leaderboardItems.once('value');
        var updates = snapshot.val();

        snapshot.forEach(async element => {
            const playerRef = admin.database().ref("players/" + element.key + "/playerProfile");
            await playerRef.once('value', (result) => {

                if (result.exists) {
                    console.log("Found Element:" + result.key);
                    updates[element.key]["name"] = result.child("DisplayName").val();
                } else {
                    console.log("NOT Found Element:" + element.key);
                }
            });
        });

        console.log("Doing Final Write");

        return ref.child("/leaderboard").set(updates);
    });

【问题讨论】:

标签: javascript firebase firebase-realtime-database async-await google-cloud-functions


【解决方案1】:

是的,我按照以下步骤解决了这个问题

async function printFiles () {
  const files = await getFilePaths();

  await Promise.all(files.map(async (file) => {
    const contents = await fs.readFile(file, 'utf8');
    console.log(contents)
  }));
}

在这里回答 - Using async/await with a forEach loop

像这样!

var data_snap_arr = [];
        snapshot.forEach(child_Snapshot => {
            var stuff = child_Snapshot.val();
            stuff.key = child_Snapshot.key;
            data_snap_arr.push(stuff);
        });

        await Promise.all(data_snap_arr.map(handleSnapshot)).then(result => {
            const finalData = {};
            for (var i = 0; i < result.length; i++) {
                // process data here - data returned as array object
            }
            return ref.child("/leaderboard").set(finalData);
        });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 2019-04-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-12
    相关资源
    最近更新 更多