Javascript 我能';t让return语句正常工作
我试图返回一个值并在控制台中显示它。(目前) 用户ID被传递给“函数”。 该函数将在数据库中检查此ID,并应返回用户名。 我知道找到了正确的数据,因为console.log在函数本身中返回了正确的信息(请参阅:这是有效的) 但使用时返回值为“未定义”Javascript 我能';t让return语句正常工作,javascript,firebase,Javascript,Firebase,我试图返回一个值并在控制台中显示它。(目前) 用户ID被传递给“函数”。 该函数将在数据库中检查此ID,并应返回用户名。 我知道找到了正确的数据,因为console.log在函数本身中返回了正确的信息(请参阅:这是有效的) 但使用时返回值为“未定义”return childData.userName 调用函数 console.log( f_returnUserDetails(uid) 函数本身 function f_returnUserDetails(a){ 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
});
});
};
我不是百分之百确定,但我认为,福雷奇在中场休息和回球方面都做得不好。尝试将其更改为传统的for of循环,看看是否有效
资料来源:
除了通过以下方法之外,没有其他方法可以停止或中断forEach()循环
正在引发异常。如果需要这种行为,可以使用forEach()方法
这是错误的工具
您必须返回承诺,因为此函数是异步的
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);
});
调用新函数并传递响应
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.
}
您还需要在firebase对象之前添加return,并检查firebase对象之前是什么意思,它在哪里?这将在以下Promise{}uuuuu proto_uuu:Promise catch:u402 catch()构造函数中返回:ƒPromise()finally:ƒfinally()然后:ƒthen()Symbol(Symbol.toStringTag):“Promise”u proto_uu:object[[PromiseStatus]:“挂起”[[PromiseValue]]:未定义的
这是一个承诺。它应该是这样的。异步函数不能合理地返回任何其他内容(除非它允许回调)。请确保您添加了。然后在函数调用后,
您将在中得到您的响应。然后,
回调请原谅我的无知,这对我来说是新的。我如何从承诺中提取值?尽管console.log返回了正确的值(只有正确的值)返回是什么意思?它只是将值记录在控制台中。它不会传回。我还认为您需要将返回添加到firebase调用中。请参阅我的更新答案。回调和承诺是一种非此即彼的情况。on
每次都会触发回调;回调的返回值不能使用。once
将返回一个承诺,该承诺将在该事件的第一个实例中实现,并将值传递给then
handler,然后您可以通过从then
handler返回一个值,将该值链接成一个新的承诺。@B.Blunt您的代码返回以下内容:ƒ(快照){for(快照的子快照){key=childSnapshot.key;childData=childSnapshot.val();console.log(childData.userName);//这很有效
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.
}