Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/three.js/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 控制台日志(数组)中的Firestore onSnapshot值与我返回的值(函数)不同_Javascript_Reactjs_Firebase_Google Cloud Firestore_Es6 Promise - Fatal编程技术网

Javascript 控制台日志(数组)中的Firestore onSnapshot值与我返回的值(函数)不同

Javascript 控制台日志(数组)中的Firestore onSnapshot值与我返回的值(函数)不同,javascript,reactjs,firebase,google-cloud-firestore,es6-promise,Javascript,Reactjs,Firebase,Google Cloud Firestore,Es6 Promise,我已经在这上面呆了很长时间了,不知道发生了什么 我正在运行以下函数: const getEmployees=async()=>{ const query=await db.collection('employees') const employees=query.onSnapshot(函数(querySnapshot)){ const employeeArr=[]; querySnapshot.forEach(函数(doc){ employeeArr.push(doc.data()); });

我已经在这上面呆了很长时间了,不知道发生了什么

我正在运行以下函数:

const getEmployees=async()=>{
const query=await db.collection('employees')
const employees=query.onSnapshot(函数(querySnapshot)){
const employeeArr=[];
querySnapshot.forEach(函数(doc){
employeeArr.push(doc.data());
});
控制台日志(1,employeeArr)
返回雇员arr;
})
console.log(2名员工)
返回员工
}
log(employeeArr)准确地显示了我想要检索的内容:一个包含包含员工详细信息(姓名,birhtday)的对象的数组。但是,当我在记录以下内容后返回此数组和console.log(employees)时:

ƒ(){
i、 Xl(),r.os.ds(函数(){
返回Rr(r.B_uo);
});
}
这(2)也记录在阵列(1)之前


我一直在关注firestore上的文档,到目前为止还不错,但我无法理解这一点。如果调用getEmployees()并存储它返回的值,它也会显示函数。有人知道我为什么以及如何修复它吗?谢谢

您正在employees变量中保存query.onSnapshot()的结果。 此外,使用onSnapshot()时,每当集合中有数据更新时,都会调用回调,等待您的代码。我认为您只需要获取一次数据,要做到这一点,您只需要:

const employees = await query.get();

此处引用:

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

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


完成后,如果无法删除此侦听器,则意味着您将泄漏该侦听器,并将对其随时间的读取收取费用。这很糟糕。

我们将对此进行更详细的解释,但关键是:
onSnapshot
不会返回有用的值,而是需要一个回调函数,它将数据提供给该函数。它返回的是一个“unsubscribe”函数,您在使用snapshot时需要调用该函数。@raina77ow不,onSnapshot返回一个非常有用的函数,您可以使用该函数注销监听器,当您使用它时应该调用它。@DougStevenson重点是它并不重要,但这不是OP期望的价值。@raina77ow谢谢!这很有道理:我将使用回调来获取我需要的数据!谢谢你的回复!我以前使用过get(),但我特别想用onSnapshot实现这一点,因为能够添加新员工并看到他们实时更新非常重要。这有可能吗?谢谢你的回复!这很有道理,我将使用回调来获取我需要的数据:)如果您发现这个答案很有用,通常在堆栈溢出时使用左侧的按钮向上投票和接受答案。
var unsubscribe = db.collection("cities")
    .onSnapshot(function (){
      // Respond to data
      // ...
    });

// Later ...

// Stop listening to changes
unsubscribe();