Firebase函数 - 使用async / await和once()函数

时间:2018-05-07 14:41:23

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

我是打字稿的新手,到目前为止我已经用它管理了但是我发现了一个奇怪的错误/错误,我无法用异步/等待来解决。

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

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

1 个答案:

答案 0 :(得分:2)

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

  1. 使用返回的promise从查询中获取数据。
  2. 将回调函数作为第二个参数传递,以从查询中获取数据。
  3. 如果您要使用async / await,我会选择1.现在看起来您使用的是1和2的组合。不要打扰如果您要使用它返回的promise,则将回调函数传递给once()。这有点挫败了使用async / await的目的。

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