我无法使return语句正常工作

时间:2018-10-26 09:23:38

标签: javascript firebase

我试图返回一个返回值并将其显示在控制台中。(目前) 用户ID传递给“功能”。 该函数将在数据库中检查此ID,并应返回userName。 我知道找到了正确的数据,因为console.log在函数本身中返回了正确的确认(请参阅:此工作) 但是,使用return childData.userName;

时返回的值是“ undefined”

调用函数

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
      });
    });
  };

3 个答案:

答案 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循环,看看是否可行。

来源:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/forEach#Description

  

除了通过以下方式之外,没有其他方法可以停止或中断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.
}