【问题标题】:Firebase functions - Using async/await with once() functionFirebase 函数 - 将 async/await 与 once() 函数一起使用
【发布时间】:2018-10-17 10:00:09
【问题描述】:

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

我有以下代码 sn-p,我的问题是 '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() 函数完成,我只是不确定这是为什么?

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 非常感谢,这很有道理,它解决了我的问题
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 2017-10-25
    • 2022-11-23
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多