【问题标题】:Firestore onSnapshot value that I console log (array) is different from the one I return (function)我控制台日志(数组)的 Firestore onSnapshot 值与我返回的(函数)不同
【发布时间】:2020-10-10 22:34:43
【问题描述】:

我已经被这个问题困扰了很长一段时间了,不知道发生了什么。

我正在运行以下函数:

const getEmployees = async () => {
    const query = await db.collection('employees')
    const employees = query.onSnapshot(function (querySnapshot) {
        const employeeArr = [];
        querySnapshot.forEach(function (doc) {
            employeeArr.push(doc.data());
        });

        console.log(1, employeeArr)
        return employeeArr;
    })
    console.log(2, employees)
    return employees
}

console.log(employeeArr) 准确地显示了我想要检索的内容:一个包含员工详细信息(姓名、生日)的对象的数组。但是,当我在记录以下内容后返回此数组和 console.log(employees) 时:

ƒ () {
      i.Xl(), r.os.ds(function () {
        return Rr(r.B_, o);
      });
    }

这 (2) 也记录在数组 (1) 之前。

我一直在关注 firestore 上的文档,到目前为止一切都很好,但我无法理解这一点。如果我调用 getEmployees() 并存储它返回的值,它也会显示函数。任何人都知道为什么以及如何解决它?谢谢!

【问题讨论】:

  • 这在here 中有更详细的解释,但关键在于:onSnapshot 不会返回有用的值,而是需要一个回调函数,它将向其中提供数据。它返回的是一个“取消订阅”函数,当您完成快照时,您应该调用它。
  • @raina77ow 不,onSnapshot 返回一个非常有用的函数,您可以使用该函数取消注册您在完成后应该调用的侦听器。
  • @DougStevenson 重点是它并不重要,但这不是 OP 期望使用的值。
  • @raina77ow 谢谢!这很有意义:D 我将使用回调来获取我需要的数据!

标签: javascript reactjs firebase google-cloud-firestore es6-promise


【解决方案1】:

您将 query.onSnapshot() 的结果保存在 employees 变量中。 同样使用 onSnapshot() 每次集合中有数据更新时都会调用回调,查看您的代码我认为您只是想获取一次数据并这样做您只需要:

const employees = await query.get();

参考这里:https://firebase.google.com/docs/firestore/query-data/get-data

【讨论】:

  • 感谢您的回复!我以前使用过 get(),但我特别想用 onSnapshot 来执行此操作,因为能够添加新员工并实时查看他们的更新非常重要。这有什么可能吗?
【解决方案2】:

您不能将 Promise 的使用与实时数据库侦听器混合使用。它们不兼容。返回 promise 的函数(与任何异步函数一样)旨在异步返回单个结果。 onSnapshot 不返回承诺。 相反,只要查询结果发生变化,它就会调用提供的回调。

如果您想要实时结果,则必须正确处理快照侦听器。 onSnapshot 返回一个函数,您在完成后调用该函数来删除侦听器。你可以在documentation看到一个例子:

var unsubscribe = db.collection("cities")
    .onSnapshot(function (){
      // Respond to data
      // ...
    });

// Later ...

// Stop listening to changes
unsubscribe();

完成后未能删除此侦听器意味着您将泄漏该侦听器,并且随着时间的推移您将为其读取付费。这很糟糕。

【讨论】:

  • 感谢您的回复!这很有意义,我将使用回调来获取我需要的数据:)
  • 如果您发现此答案有帮助,Stack Overflow 上的习惯做法是通过左侧的按钮同时投票和接受答案。
猜你喜欢
  • 1970-01-01
  • 2020-06-07
  • 2019-04-20
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-22
  • 1970-01-01
相关资源
最近更新 更多