Возвращение массива результатов из запроса Firebase - PullRequest
0 голосов
/ 14 июля 2020

Я использую оболочку @react-native-firebase для взаимодействия с Firebase Firestore. У меня есть функция, которая выполняет некоторые запросы к одной из моих коллекций, и предполагаемый ответ должен быть объектом Array, содержащим каждый найденный документ.

Моя функция в настоящее время выглядит так:

export const backendCall = async => {
  let response = [] 
  firestore()
  .collection('collection')
  .where('id', '==', 1)
  .onSnapshot(documentSnapshot => {
    documentSnapshot.forEach(x => response.push(x.data())) 
  })
  return response 

На моем Пользовательский интерфейс, я использую компонент react-native Button, который вызывает эту функцию onPress:

<Button 
  title="get" 
  onPress={() => {
    backendCall().then(response => console.log(response)) 
  }}
/> 

Используя console.log, я могу наблюдать ожидаемый объект Array (но со значением " ниже был оценен только что "значок. Однако если я изменю onPress на console.log(JSON.stringify(response)), объект Array будет пуст.

Я предполагаю, что это как-то связано с asyn c звонит, но я не могу понять, как это исправить. Буду признателен за некоторые указатели.

1 Ответ

2 голосов
/ 14 июля 2020

Вы возвращаете ответ, не дожидаясь результата вашего запроса firebase. Чтобы дождаться получения ответа перед возвратом, вы можете использовать Promise.

export const backendCall = () => {
    return new Promise(resolve => {
        firestore()
            .collection('collection')
            .where('id', '==', 1)
            .onSnapshot(documentSnapshot => {
                const response = []
                documentSnapshot.forEach(x => response.push(x.data()))
                resolve(response)
            })
    })
}

Вы можете использовать Array.map, чтобы for l oop выглядел лучше.

const response = documentSnapshot.map(x => x.data())
resolve(response)
...