async / await似乎不适用于firebase forEach。此代码为快照的第一个子项运行console.log,然后挂起。这是一个错误还是我错过了什么?
main()
async function main() {
const snap = await root.ref('somepath')
.once('value')
snap.forEach(async val => {
await console.log(val.key)
})
}
答案 0 :(得分:6)
这是一个功能的无意结果,有时会被视为一个错误。从firebase文档:
async
函数始终返回Promise。承诺是真实的价值:
!!Promise.resolve===true
。
作为解决方法,请尝试以下解决方案:
main()
async function main() {
const snap = await root.ref('somepath')
.once('value')
snap.forEach(function wrapper(){async val => {
await console.log(val.key)
}})
在转移到下一个快照之前,它不会等待承诺完成。这需要更多的代码,但这可能不是你需要的。
答案 1 :(得分:0)
我使用这样的东西:
import * as admin from "firebase-admin";
type FunctionOnDataSnapshot = (childSnapshot: admin.database.DataSnapshot) => Promise<any>;
export const asyncForEach = async (dataSnapshot: admin.database.DataSnapshot, childFunction: FunctionOnDataSnapshot) => {
const toWait = [];
dataSnapshot.forEach(childSnapshot => {
toWait.push(childFunction((childSnapshot)));
});
await Promise.all(toWait);
};