0
votes

Promettez tout et mettez à jour correctement l'état à l'aide de React.js

récupération des données d'API, je reçois de telles données: xxx

afin d'obtenir des informations plus détaillées, je dois récupérer chaque URL. J'essaie de le faire avec la promesse.Tous et mettez à jour l'état, mais le code ne fonctionne pas: xxx

Veuillez conseiller ce que je fais mal.


0 commentaires

4 Réponses :


1
votes

Promess.Tout Devrait avoir une matrice ou une promesse, l'argument devrait donc être une gamme de récupérations.

p>

Promise.all(this.state.names.map(name =>
  fetch(name.url)))
  .then(results => results.forEach(result => result.json())
  .then(r => {
    this.setState({
      pokemons: [...this.state.pokemons, r]
    })
  })


1 commentaires

Merci de votre aide!)



1
votes

Votre problème est que vous appelez à la fois LoadPokemons et LoadPokemonAdditionAlinfo dès que votre composant monte. Vous devez attendre jusqu'à ce que vous ayez récupéré le nom des pokemons, avant de chercher leurs informations supplémentaires.

this.loadpokemonadditionalinfo () doit être appelé à partir du rappel de State comme xxx < / pré>


1 commentaires

Merci Ravi et Stephan! Vous avez raison et m'a beaucoup aidé! Ça fonctionne maintenant!



1
votes

Premièrement, lorsque vous essayez de charger les données supplémentaires, les noms n'auront pas fini.

Faites simplement votre ComponentDidMount CODE> Fonction Async et attendez chaque appel (assurez-vous également que vous retournez. une promesse pour chacun). P>

const results = [{ name:'John' }, { name:'Jane' }];

console.log('forEach', results.forEach(result => result.name));
console.log('map', results.map(result => result.name));


2 commentaires

Merci beaucoup, mais cette opération avec Async-attendre n'aide pas. Y a-t-il d'autre manière comment le faire? En outre, pourquoi utiliser une carte au lieu de pourach?


La fonction foreach est uniquement itération de la matrice et ne renvoie rien. Vous avez besoin de la fonction Carte pour cartographier les résultats à une nouvelle gamme de noms.



1
votes

Vous ne pouvez pas exécuter à la fois

loadPokemons(){
  fetch('https://pokeapi.co/api/v2/pokemon-species')
    .then(res => res.json())
    .then(json => {
      this.setState({
        isLoaded: true,
        names: json.results
      }, () => {
        this.loadPokemonAdditionalInfo()
      })
    })
}

loadPokemonAdditionalInfo() {
  const { names } = this.state;
  const promises = names.map(
    name => fetch(name.url).then(response => response.json())
  )
  Promise.all(promises).then(results => {
    this.setState({
      pokemons: [...this.state.pokemons, ...results]
    })
  })
}

componentDidMount(){
  this.loadPokemons();
}


1 commentaires

Oui, ça marche maintenant! Wow! Merci beaucoup pour une explication et votre aide!