Firebase Unhandled Promise Rejection при запросе базы данных - PullRequest
0 голосов
/ 11 октября 2018

Я делаю проект, в котором я использую Redux для управления приложением с помощью промежуточного программного обеспечения.Однако, когда я вызываю функцию ниже из действий, она дает мне,

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 дает мне обещание, прежде чем получить это предупреждение.

Promise {_40: 0, _65: 0, _55: null, _72: null}

Вопрос

Я хочу дождаться до запроса в базу данных и получить данныев формате JSON.

Примечание

Это происходит потому, что firebase.database().ref('Users') не возвращает обещание.Но как я могу получить значение var в line 4 после оценки функции getData?

1 Ответ

0 голосов
/ 12 октября 2018

Этот код:

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

Пока ничего не делает с базой данных.Он просто создает ссылку на потенциальную ссылку /Users в базе данных.Это чисто клиентская операция, поэтому не нужно возвращать обещание.

Загрузка данных из базы данных осуществляется путем вызова on() или once().Между этими значениями once() загружает данные только один раз и возвращает обещание.С другой стороны, 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...