我正在尝试学习/实现异步功能,但不确定为什么无法使它正常工作。我的异步函数中的“用户”返回未定义。但是,进行数据库调用的功能可以正常工作。
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)
}
}
答案 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有关。