查询数据库时Firebase未处理的承诺拒绝

时间:2018-10-11 17:39:05

标签: javascript firebase react-native firebase-realtime-database async-await

我正在做一个项目,在其中我使用redux来管理具有笨拙中间件的应用程序。但是,当我从动作中调用下面的函数时,它给了我

var arr = ["ax", "mof", "4", "63", "42", "3", "10", "[", "23", "adidas", "ba", ")", "ABC"]
var symbols = "()[]{}!@#$%¨&*-_=+".split("");

function compare(array){
  array.sort((a,b) => {
  
    if (symbols.indexOf(a) > -1) a = "zzzzzzz"    
    if (symbols.indexOf(b) > -1) b = "zzzzzzz"

    if (!isNaN(Number(a)) && !isNaN(Number(b))){      
        if (Number(a) > Number(b)){
          return 1;
        }else if(Number(a) < Number(b)){
          return -1;
        }else{
          return 0;
        }
        
    }else{         
      if (a.toUpperCase() > b.toUpperCase()){
          return 1;
      }else if(a.toUpperCase() < b.toUpperCase()){
        return -1;
      }else{
        return 0;
      }      
    }    
  })
  return array;
}

console.log(compare(arr))

代码

Possible Unhandled Promise Rejection (id: 0): Error: Cannot read property 'then' of undefined.

因此,当我运行1 export const submitEmail=(email)=>{ 2 return(dispatch) =>{ // Still did not use dispatch 3 val = getData(email); 4 console.log(val); 5 } 6 }; 7 8 const getData = async(email)=>{ 9 let usersRef = await firebase.database().ref('Users') 10 usersRef.orderByChild('email').equalTo(email).on("value", (snapshot) => { 11 snapshot.forEach((snap) => { 12 return snap.val(); 13 })}); 14 } 函数时,submitEmail的值会在出现此警告之前给我保证。

val

问题

我要等待,直到查询数据库并获取json格式的数据。

注意

发生这种情况是因为Promise {_40: 0, _65: 0, _55: null, _72: null} 没有返回承诺。但是,在评估firebase.database().ref('Users')函数之后,如何在var中获得line 4的值?

1 个答案:

答案 0 :(得分:0)

此代码:

firebase.database().ref('Users')

对数据库不执行任何操作。它仅创建对数据库中潜在/Users引用的引用。这是一个纯粹的客户端操作,因此不需要返回承诺。

通过调用on()once()从数据库加载数据。这两个once()之间仅加载一次数据,并返回一个Promise。另一方面,on()开始连续监听数据。由于这是一个连续的过程,因此它永远不会完成,因此on()无法返回承诺。

您想要的东西可能是

export const submitEmail=(email)=>{
  return(dispatch) =>{
    val = getData(email);
    console.log(val);
  }
};

const getData = async(email)=>{
  let usersRef = firebase.database().ref('Users')
  let snapshot = await usersRef.orderByChild('email').equalTo(email).once("value")
  let userSnapshot
  snapshot.forEach((child) => {
    userSnapshot = child
  });
  return userSnapshot
}