首页 > 解决方案 > Firebase 函数 - 将 async/await 与 once() 函数一起使用

问题描述

我对打字稿相当陌生,到目前为止我已经使用它,但我发现了一个奇怪的错误/错误,我无法通过 async/await 弄清楚。

我有以下代码片段,我的问题是 'await' 子句不适用于 .once() 函数。

async function testFunction(deviceID:string){
    const returnObject:{name:string, description:string, tokens:string[]}[] = [];

    const deviceRef = admin.database().ref('deviceInfo/').orderByChild('id').equalTo(deviceID);

    await deviceRef.once('value', async (payload) => {
        const pushObject:{name:string, description:string, tokens:string[]} = {name:"", description:"", tokens:[]};
        if(payload.exists()){
            const devices = payload.val();
            const keys = Object.keys(devices);

            for(const key of keys){
                pushObject.name = devices[key].name;
                pushObject.description = devices[key].description;
                pushObject.tokens = await getTokens(key);
                returnObject.push(pushObject);

            }
            console.log("Return Object 1:", returnObject);
            return returnObject;

        }
        else{
            return null;
        }

    })
    console.log("Return Object 2:", returnObject);
    return returnObject;
}

这个函数总是返回 {name:" ", description: " ", tokens:[]} 即使我在 deviceRef.once() 函数的开头有'await'。

同样,console.logs 打印,“返回对象 1”打印正确的对象以及从数据库中检索到的所有数据,但“返回对象 2”打印一个空数组。所以很明显,await 没有等待 once() 函数完成,我只是不确定这是为什么?

任何帮助或建议将不胜感激

标签: typescriptfirebasefirebase-realtime-databaseasync-awaitgoogle-cloud-functions

解决方案


使用 once() 时,您可以选择以下两个选项之一:

  1. 使用返回的 promise 从查询中获取数据。
  2. 传递回调函数作为第二个参数以从查询中获取数据。

如果您要使用 async/await,我会选择选项 1。现在看起来您正在使用 1 和 2 的组合。如果您“不要费心将回调函数传递给 once()”重新使用它返回的承诺。这有点违背了使用 async/await 的目的。

const payload = await deviceRef.once('value')
if (payload.exists()) { ... }

推荐阅读