typescript - 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() 函数完成,我只是不确定这是为什么?
任何帮助或建议将不胜感激
解决方案
使用 once() 时,您可以选择以下两个选项之一:
- 使用返回的 promise 从查询中获取数据。
- 传递回调函数作为第二个参数以从查询中获取数据。
如果您要使用 async/await,我会选择选项 1。现在看起来您正在使用 1 和 2 的组合。如果您“不要费心将回调函数传递给 once()”重新使用它返回的承诺。这有点违背了使用 async/await 的目的。
const payload = await deviceRef.once('value')
if (payload.exists()) { ... }
推荐阅读
- android - 我的 android studio 没有在 windows 10 上打开
- flutter - HATEOAS API Flutter 客户端推荐
- c++ - 如何在虚幻引擎中使用第三方库 Eigen?
- javascript - 在“片段”中键入段落时出错
- javascript - Bootstrap 5:在 Button 中对齐图标和文本
- python - Python Pandas 删除具有数字的行(不是浮点数也不是整数,而是像 1.2.3)
- python - 移植到 Python 3.7,poster3.encode.multipart_encode,TypeError: memoryview: a bytes-like object is required, not 'str'
- angular - 在 Angular 中使用 IconFinderCore 进行图标化返回“not_found”错误
- r - 如何返回列的行值,使得它们在另一列中的对应值是最小的 n 值,在 R
- amazon-web-services - AWS DeviceFarm 忽略 TestNG 注释