我用这个异步功能怎么了?

时间:2019-09-14 18:26:16

标签: javascript firebase

我正在尝试学习/实现异步功能,但不确定为什么无法使它正常工作。我的异步函数中的“用户”返回未定义。但是,进行数据库调用的功能可以正常工作。

 const getUsers = () => {
    const database = firebase.database()
    const users = database.ref('users');
    users.on('value', function(snapshot) {
        const users = []
        snapshot.forEach(function(childSnapshot) {
          let user = childSnapshot.val();
          users.push(user)
        });
        return users
    });
  }

  async function generateRandomPotentialPartner() {
    try {
      const users = await getUsers();
      console.log(users)
    } catch (error) {
      console.log(error)
    }
  }

2 个答案:

答案 0 :(得分:1)

使用on()的Promise版本,而不是使用回调版本,然后从getUsers()函数返回该Promise。

使用当前使用的回调方法,因为回调的返回不会返回到外部函数,因此根本不会返回任何东西

const getUsers = () => {
  const database = firebase.database()
  const users = database.ref('users');
  // return the on() promise instead of using callback
  return users.on('value').then(snapshot => {
    const users = []
    snapshot.forEach(childSnapshot => {          
      users.push(childSnapshot.val())
    });
    return users
  });
}

答案 1 :(得分:-2)

 const getUsers = () => {
const database = firebase.database()
const users = database.ref('users');
users.on('value', function(snapshot) {
    const users = []
    snapshot.forEach(function(childSnapshot) {
      let user = childSnapshot.val();
      users.push(user)
    });
    return new Promise((resolve,reject) => {
      if(users.length == 0){
        reject("There are no users"); //--- Handle rejection
      }else {
        resolve(users);
      }

    });
  });
}

您的问题是您没有返回承诺。异步Javascript仅与Promise和Chaining有关。