【问题标题】:Firebase Database Snapshot ForEach Async AwaitFirebase 数据库快照 ForEach 异步等待
【发布时间】:2018-01-17 15:11:42
【问题描述】:

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)

  })
}

【问题讨论】:

    标签: firebase firebase-realtime-database


    【解决方案1】:

    这是某个功能的无意结果,有时称为错误。从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)
      }})
    

    不过,它不会等待 promise 完成后才移动到下一个快照。这将需要更多代码,但无论如何这可能不是您所需要的。

    【讨论】:

    • 感谢您的回答。很好的解释。我认为firebase文档非常好。很惊讶我错过了。我在你发帖后就看到了。这个响应很慢;)
    • 谢谢 - 花了这么长时间试图弄清楚这一点。我尝试了 § for (child in snapshot) § 方法,但快照不可交互,所以这个答案应该会有所帮助
    • “不过,它不会等待承诺完成,然后再移动到下一个快照。” - 但这不是“等待”的全部意义吗?这样我们就可以让一些代码完成,然后再进入下一段代码/快照?
    • @Davie,这取决于您的用例。您可能只需要为每个项目完成一系列顺序等待,但同时重叠不同的项目
    【解决方案2】:

    我使用这样的东西:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-18
      • 2023-03-24
      • 2021-04-16
      • 2016-02-16
      • 2019-06-29
      • 2020-10-20
      • 2018-09-13
      • 2018-05-04
      相关资源
      最近更新 更多