Firebase数据库快照ForEach异步等待

时间:2017-08-09 16:01:40

标签: 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)

  })
}

2 个答案:

答案 0 :(得分:6)

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

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);
};