Firebase数据库快照ForEach异步等待

pro*_*zac 6 firebase firebase-realtime-database

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)

  })
}
Run Code Online (Sandbox Code Playgroud)

Kar*_*ell 6

这是一个功能的无意结果,有时会被称为错误.从firebase文档: Firebase文档

一个async函数总是返回的承诺.承诺是真实的价值:

!!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)
  }})
Run Code Online (Sandbox Code Playgroud)

在转移到下一个快照之前,它不会等待承诺完成.这需要更多的代码,但这可能不是你需要的.

  • "它不会等到承诺完成,然后转移到下一个快照." - 但这不是"等待"的全部意义吗?这样我们可以在进入下一段代码/快照之前让一些代码完成? (2认同)

Art*_*rek 5

我用这样的东西:

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);
};
Run Code Online (Sandbox Code Playgroud)