Реагируйте setState на значение, полученное из ответа http - PullRequest
0 голосов
/ 04 июля 2018

Прежде всего, пожалуйста, извините меня по-английски, я не являюсь носителем языка. Я постараюсь объяснить все возможное.

Я пытаюсь установить состояние моего компонента равным значению, полученному из http-запроса, который выполняется на componentDidMount (). После setState я передаю реквизиты дочерним компонентам и ожидаю, что они будут перерисованы.

//App.js
import getAuthStateFromServer from './getAuthStateFromServer'

class App extends React.Component {
  constructor(props) {
    super(props)
    this.state = {
      AuthState
    }
    this.getAuthState.bind(this)
  }

  componentDidMount() {
    this.getAuthState()
  }

  getAuthState() {
     getAuthStateFromServer().then(AuthState => 
       this.setState({ AuthState })
     ) 
  }

   render() {
     return <h1>{this.state.AuthState.userData.userName}</h1>
   }
}


//getAuthStateFromServer.js

import axios from 'axios'
import { getAuth } from './AuthStorage' 

const getAuthStateFromServer = () => new Promise((resolve, reject) => {
   // Create AuthState object
   const AuthState = {
     userData: {},
     isLoggedIn: false,
   }
   // 1. get token
   const { token } = getAuth()
   // 2. if have token
   if(token) {
     // authenticate!
     // send get request with token in header
     axios.get('http://localhost:3500/validate', {
       headers: { 'Authorization': `Bearer ${token}` }
     }).then((res) => {
        AuthState.userData = res.data
        AuthState.isLoggedIn = true
        resolve(AuthState)
     }).catch(e => reject(e))
   }
   resolve(AuthState)
  })

 export default getAuthStateFromServer

Итак, я получил объект AuthState, когда я вошел в консоль, но мой компонент не перерисовал.

Но если я возьму то, что находится внутри моей функции getAuthFromServerFunction, и вставлю ее в мой componentDidMount, как это ..

componentDidMount() {
  this.getAuthState()
 }

 getAuthState() {
   const AuthState = {
     userData: {},
     isLoggedIn: false,
   }
   // 1. get token
   const { token } = getAuth()
   axios.get('http://localhost:3500/validate', {
      headers: { 'Authorization': `Bearer ${token}` },
   }).then((res) => {
     AuthState.userData = res.data
     AuthState.isLoggedIn = true
     this.setState({ AuthState })
   })
 }

Это работает .. и мой компонент перерисовывается

Я полностью в замешательстве, пытаясь понять это .. Любая помощь будет принята с благодарностью, спасибо

1 Ответ

0 голосов
/ 04 июля 2018

Я думаю, что ваша getAuthStateFromServer функция нехороша.

Я чувствую, что это всегда будет разрешаться до одного и того же значения;)

const getAuthStateFromServer = () => new Promise((resolve, reject) => {
   // Create AuthState object
   const AuthState = {
     userData: {},
     isLoggedIn: false,
   }
   // 1. get token
   const { token } = getAuth()
   // 2. if have token
   if(token) {
     // authenticate!
     // send get request with token in header
     axios.get('http://localhost:3500/validate', {
       headers: { 'Authorization': `Bearer ${token}` }
     }).then((res) => {
        AuthState.userData = res.data
        AuthState.isLoggedIn = true
        resolve(AuthState) // <-- When this line will be called, the promise will always be resolved by the line below.
     }).catch(e => reject(e))
   }
   resolve(AuthState) // <-- This line will always be called before the one with the value above. 
  })

Удалите последнюю строку resolve(AuthState), это нарушает ваше обещание! Посмотрите мои комментарии в коде выше;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...