我试图返回一个返回值并将其显示在控制台中。(目前)
用户ID传递给“功能”。
该函数将在数据库中检查此ID,并应返回userName。
我知道找到了正确的数据,因为console.log在函数本身中返回了正确的确认(请参阅:此工作)
但是,使用return childData.userName;
调用函数
console.log( f_returnUserDetails(uid)
函数本身
function f_returnUserDetails(a){
console.log(a)
var key;
var childData;
firebase.database().ref('/dataman-blabla/').orderByChild("uid").equalTo(a).on('value', function (snapshot) {
snapshot.forEach(function(childSnapshot) {
key = childSnapshot.key;
childData = childSnapshot.val();
console.log(childData.userName); //THIS WORKS
return childData.userName; //THIS DOES NOT
});
});
};
答案 0 :(得分:1)
您必须返回promise,因为此函数是异步的。
function f_returnUserDetails(a){
console.log(a)
var key;
var childData;
return new Promise(function(resolve, reject) { //return promise
firebase.database().ref('/dataman-blabla/').orderByChild("uid").equalTo(a).on('value', function (snapshot) {
snapshot.forEach(function(childSnapshot) {
key = childSnapshot.key;
childData = childSnapshot.val();
console.log(childData.userName);
resolve(childData.userName);
});
});
});
};
// function call should be like this
f_returnUserDetails(uid).then((username) => {
console.log(username);
});
答案 1 :(得分:0)
我不确定100%,但是我认为.forEach不能很好地利用休息和回报。尝试将其更改为传统的for循环,看看是否可行。
除了通过以下方式之外,没有其他方法可以停止或中断forEach()循环: 引发异常。如果您需要这种行为,请使用forEach()方法 是错误的工具。
return firebase.database().ref('/dataman-blabla/').orderByChild("uid").equalTo(a).on('value', function (snapshot) {
for(childSnapshot of snapshot) {
key = childSnapshot.key;
childData = childSnapshot.val();
console.log(childData.userName); //THIS WORKS
return childData.userName; //THIS DOES NOT
});
});
答案 2 :(得分:0)
调用新函数并传递响应
function f_returnUserDetails(a){
console.log(a)
var key;
var childData;
firebase.database().ref('/dataman-blabla/').orderByChild("uid").equalTo(a).on('value', function (snapshot) {
snapshot.forEach(function(childSnapshot) {
key = childSnapshot.key;
childData = childSnapshot.val();
console.log(childData.userName); //THIS WORKS
processData(childData.userName);
});
});
};
function processDate(name){
// You have your name here.
}