我正在尝试从Firebase文档中吸引所有用户。我怀疑我的问题是我对javascript的理解有局限性。
在没有运气和异步模式的情况下,我都尝试过这一点
const getUsers = () => {
database.collection('users').onSnapshot(docs => {
const users = [];
docs.forEach(doc => {
users.push({
...doc.data(),
id: doc.id,
ref: doc.ref,
});
});
return users;
});
};
let users = getUsers();
users &&
users.map(user => {
console.log('name: ', user.displayName);
});
最终,我想遍历每个用户
答案 0 :(得分:1)
如@GazihanAlankus所述,由于对Firestore数据库的查询是异步操作,因此您需要使用get()
方法在函数中返回Promise,如下所示:
const getUsers = () => {
return //Note the return here
database
.collection('users')
.get()
.then(querySnapshot => {
const users = [];
querySnapshot.forEach(doc => {
users.push({
...doc.data(),
id: doc.id,
ref: doc.ref
});
});
return users;
});
};
然后您需要按以下方式调用它:
getUsers().then(usersArray => {
console.log(usersArray);
usersArray.map(user => {
console.log('name: ', user.displayName);
});
});
因为该函数返回一个Promise,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then。
您可以进行以下测试,并查看console.log()
的执行顺序以及控制台中第二console.log()
的打印内容:
getUsers().then(usersArray => {
console.log(usersArray);
usersArray.map(user => {
console.log('name: ', user.name);
});
});
console.log(getUsers());
答案 1 :(得分:0)
您不能具有从Firebase获取用户的非异步功能。您正在尝试使不可能发生。
这是您的代码有什么问题:return users;
从您给onSnapshot
的闭包中返回。它不是从getUsers
返回。 return
中没有getUsers
,因此它实际上返回undefined
。
您赋予onSnapshot
的闭包将在将来运行,但是getUsers
必须在过去返回。如果没有数据,就无法传递过去的数据。您必须返回一个承诺并在调用代码中进行处理。您不能编写直接直接返回用户的getUsers。