我如何遍历firebase的结果

时间:2019-05-04 16:29:36

标签: javascript firebase google-cloud-firestore

我正在尝试从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);
    });

最终,我想遍历每个用户

2 个答案:

答案 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。