La bibliothèque axios crée un objet Promise(). Promise est un objet intégré dans JavaScript ES6. Lorsque cet objet est instancié à l'aide du mot-clé new, il prend une fonction comme argument. Cette fonction unique prend à son tour deux arguments, qui sont également des fonctions - resolve et reject.
Les promesses exécutent le code côté client et, en raison de cool Le flux asynchrone Javascript, pourrait finalement résoudre une ou deux choses, cette résolution (généralement considérée comme sémantiquement équivalente au succès d'une Promise), ou ce rejet (largement considéré comme une résolution erronée). Par exemple, nous pouvons détenir une référence à un objet Promise qui comprend une fonction qui va éventuellement retourner un objet de réponse (qui serait contenu dans l'objet Promise). Ainsi, une façon d'utiliser une telle promesse est d'attendre que la promesse se résolve en une sorte de réponse .
Vous pourriez soulever que nous ne voulons pas attendre quelques secondes pour que notre API renvoie un appel ! Nous voulons que notre interface utilisateur puisse faire les choses suivantes tandis que en attendant la réponse de l'API. Dans le cas contraire, nous aurions une interface utilisateur très lente. Alors comment gérer ce problème ?
Une promesse, c'est asynchrone . Dans une implémentation standard des moteurs responsables de l'exécution du code Javascript (comme Node, ou le navigateur commun), elle sera résolue dans un autre processus alors que nous ne savons pas à l'avance quel sera le résultat de la promesse. Une stratégie habituelle consiste alors à envoyer nos fonctions (par exemple, une fonction React setState pour une classe) à la promesse, résolue en fonction d'une sorte de condition (dépendant de notre choix de bibliothèque). Ainsi, nos objets Javascript locaux seront mis à jour en fonction de la résolution de la promesse. Ainsi, au lieu de getters et setters (dans la POO traditionnelle), vous pouvez penser à des fonctions que vous pourriez envoyer à vos méthodes asynchrones.
Je vais utiliser Fetch dans cet exemple pour que vous puissiez essayer de comprendre ce qui se passe dans la promesse et voir si vous pouvez reproduire mes idées dans votre code axios. Fetch est fondamentalement similaire à axios sans la conversion JSON innée, et a un flux différent pour la résolution des promesses (que vous devriez vous référer à la documentation axios pour apprendre).
GetCache.js
const base_endpoint = BaseEndpoint + "cache/";
// Default function is going to take a selection, date, and a callback to execute.
// We're going to call the base endpoint and selection string passed to the original function.
// This will make our endpoint.
export default (selection, date, callback) => {
fetch(base_endpoint + selection + "/" + date)
// If the response is not within a 500 (according to Fetch docs) our promise object
// will _eventually_ resolve to a response.
.then(res => {
// Lets check the status of the response to make sure it's good.
if (res.status >= 400 && res.status < 600) {
throw new Error("Bad response");
}
// Let's also check the headers to make sure that the server "reckons" its serving
//up json
if (!res.headers.get("content-type").includes("application/json")) {
throw new TypeError("Response not JSON");
}
return res.json();
})
// Fulfilling these conditions lets return the data. But how do we get it out of the promise?
.then(data => {
// Using the function we passed to our original function silly! Since we've error
// handled above, we're ready to pass the response data as a callback.
callback(data);
})
// Fetch's promise will throw an error by default if the webserver returns a 500
// response (as notified by the response code in the HTTP header).
.catch(err => console.error(err));
};
Maintenant que nous avons écrit notre méthode GetCache, voyons à quoi ressemble la mise à jour de l'état d'un composant React à titre d'exemple...
Quelques composants React.jsx
// Make sure you import GetCache from GetCache.js!
resolveData() {
const { mySelection, date } = this.state; // We could also use props or pass to the function to acquire our selection and date.
const setData = data => {
this.setState({
data: data,
loading: false
// We could set loading to true and display a wee spinner
// while waiting for our response data,
// or rely on the local state of data being null.
});
};
GetCache("mySelelection", date, setData);
}
En fin de compte, on ne "retourne" pas les données en tant que telles, je veux dire qu'on peut le faire mais il est plus idiomatique de changer sa façon de penser... Maintenant, nous sommes envoi de aux méthodes asynchrones.
Bon codage !
4 votes
Duplicata possible de Comment retourner la réponse d'un appel asynchrone ?
1 votes
J'ai l'impression que les gens sont allés un peu trop loin sur cette question. Fondamentalement, il manque un retour dans votre fonction axiosTest, et vous n'avez pas attendu le résultat de celui-ci. Lorsque vous travaillez avec des promesses, retournez toujours la promesse et attendez le résultat lorsque vous en avez besoin.