Axios: le chaînage de plusieurs requêtes à l'API
J'ai besoin d'enchaîner un peu de requêtes à l'API de Google Maps API, et je suis en train de le faire avec Axios.
Ici à la première demande, qui est en componentWillMount()
axios.get('https://maps.googleapis.com/maps/api/geocode/json?&address=' + this.props.p1)
.then(response => this.setState({ p1Location: response.data })) }
Voici la deuxième demande:
axios.get('https://maps.googleapis.com/maps/api/geocode/json?&address=' + this.props.p2)
.then(response => this.setState({ p2Location: response.data }))
Ensuite, nous avons une troisième demande, qui dépend de la première de deux cours d'achèvement:
axios.get('https://maps.googleapis.com/maps/api/directions/json?origin=place_id:' + this.state.p1Location.results.place_id + '&destination=place_id:' + this.state.p2Location.results.place_id + '&key=' + 'API-KEY-HIDDEN')
.then(response => this.setState({ route: response.data }))
Comment puis-je en chaîne de ces trois appels de sorte que le troisième qui se passe après les deux premiers?
OriginalL'auteur Freddy | 2017-05-25
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, pas sûr que vous voulez faire dans votre
componentWillMount
, parce que votre composant ne sera pas rendu jusqu'à ce que tout cela est fait, il est mieux de l'avoir danscomponentDidMount
et ont certains états par défaut qui sera mise à jour une fois fait avec ces demandes. Deuxièmement, vous voulez limiter le nombre de setStates vous écrire car ils sont susceptibles de provoquer des re-rend, voici une solution à l'aide de async/await:OriginalL'auteur Matt Aft
Avez-vous utilisé l'axios.tous ? Vous pouvez essayer avec quelque chose de similaire:
Cela permettra de prendre tous vos obtenir et mettre à l'intérieur une réponse qui doit être appelé .des données comme:
firstResponse.data
eh bien dans ce cas j'irais avec quelque chose comme ceci: `` axios.get('firstrequest). ensuite( firstResponse => { axios.get('secondResponse', firstResponse.les données.id) } ) ``
OriginalL'auteur Ricardo Gonzalez
Un peu en retard à la fête, mais j'aime ce modèle de chaînage promet, de revenir à tenir la promesse de la chaîne d'vivant.
OriginalL'auteur chrisz
Je pense que vous avez besoin de quelque chose comme ceci:
OriginalL'auteur Morleee
Pour de meilleures performances et plus propre code:
1. L'utilisation de la promesse.tous les() ou de l'axios.tous les() pour exécuter request1 et request2 en même temps. Donc request2 exécutera sans attendre request1 réponse. Après request1 et request2 retour à la réponse, request3 continuera d'exécuter basée sur la réponse renvoyée données en paramètre.
2. Modèle de Chaînes de back-tiques (`)
OriginalL'auteur Toh Ban Soon
Ceci est lié à la JS est Promesses. Vous pouvez résoudre de différentes façons. Le moyen le plus simple pour moi est que vous devriez nid chaque demande de départ de la première à la troisième. Cela signifie à partir de la première demande, vous devez mettre votre deuxième
axios.get(url)
dans la première demande du.then()
et de mettre de la troisième à la deuxième demande de.then()
.Pour des promesses en général, vous vous attendez à ce que l'intérieur de la
.then()
partie promesse est résolu et vous pouvez avoir accès à laresponse
. De sorte que par l'imbrication, vous pouvez résoudre le problème d'être asynchrone dans un pas de façon si élégante.OriginalL'auteur milkersarac