1 Вопрос: Как ждать firebase, получать данные и возвращать массив в методе?

вопрос создан в Wed, May 8, 2019 12:00 AM

Итак, у меня есть этот метод в компоненте контейнера:

getProfilesOptions = () => {

    const result = firebase.firestore().collection('roles').get().then(snapshot => {
      const options = []

      snapshot.docs.forEach(doc => {
        options.push({ value: doc.id, label: doc.data().profile })
        //console.log(doc.id) - everything ok, i'm fetching data correctyly
      });
      return options
    })
    console.log(result)//here i have pending result in debugger
    return result
  }

тогда я передаю ссылку на дочерний ... дочерний ... дочерний компонент.

Затем я как ребенок, я хочу вызвать его, и в результате получить массив, а затем установить состояние:

componentDidUpdate() {
    if(this.state.isFocused && !this.state.options){

      const options = this.props.getOptions()

      this.setState({
        options: options
      })
    }
  }

Могу ли я найти решение этой проблемы? Конечно, я могу передавать реквизиты в качестве результата вместо реквизитов в метод, но могу ли я использовать метод? Как улучшить getProfilesOptions?

    
0
1 ответ                              1                         

Вы должны заключить вызов Firebase в Promise, потому что это асинхронный вызов.

getProfilesOptions = () => {
   return new Promise(resolve => {
      firebase.firestore().collection('roles').get().then(snapshot => {
        const options = []

        snapshot.docs.forEach(doc => {
          options.push({ value: doc.id, label: doc.data().profile })
          //console.log(doc.id) - everything ok, i'm fetching data correctyly
        });
        resolve(options)
      })                                                          
   }  
}

И получите результат в вашем компоненте с помощью .then ()

componentDidUpdate() {
  if(this.state.isFocused && !this.state.options){

    this.props.getOptions().then(options => {
      this.setState({
        options: options
      })
    })

  }
}

Подробнее о обещаниях Javascript можно прочитать здесь

    
3
2019-05-08 17: 31: 06Z
  1. Спасибо! Я прочитаю это! Спасибо за ваш ответ! Это помогает!
    2019-05-08 17: 46: 56Z
источник размещен Вот