Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/414.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 我能';t让return语句正常工作_Javascript_Firebase - Fatal编程技术网

Javascript 我能';t让return语句正常工作

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

我试图返回一个值并在控制台中显示它。(目前) 用户ID被传递给“函数”。 该函数将在数据库中检查此ID,并应返回用户名。 我知道找到了正确的数据,因为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.
}