Deux points ressortent :
-
Su getData
ne renvoie jamais rien, donc sa promesse ( async
qui renvoient toujours une promesse) seront remplies par les fonctions undefined
s'il ne rejette pas
-
Le message d'erreur montre clairement que vous essayez d'effectuer un rendu direct de la promesse. getData
plutôt que d'attendre qu'il se stabilise et de rendre la valeur d'accomplissement
Adresse 1 : getData
devrait retourner le résultat de l'appel json
:
async getData(){
const res = await axios('/data');
return await res.json();
}
Addressig #2 : Nous devrions voir plus de votre code, mais fondamentalement, vous ne pouvez pas faire
<SomeElement>{getData()}</SomeElement>
...car cela n'attend pas la résolution. Il faudrait plutôt utiliser getData
pour définir l'état :
this.getData().then(data => this.setState({data}))
.catch(err => { /*...handle the error...*/});
...et utiliser cet état lors du rendu :
<SomeElement>{this.state.data}</SomeElement>
Mise à jour : Maintenant que vous nous avez montré votre code, il faudrait faire quelque chose comme ceci :
class App extends React.Component{
async getData() {
const res = await axios('/data');
return await res.json(); // (Or whatever)
}
constructor(...args) {
super(...args);
this.state = {data: null};
}
componentDidMount() {
if (!this.state.data) {
this.getData().then(data => this.setState({data}))
.catch(err => { /*...handle the error...*/});
}
}
render() {
return (
<div>
{this.state.data ? <em>Loading...</em> : this.state.data}
</div>
);
}
}
Nouvelle mise à jour : Vous avez indiqué votre préférence pour l'utilisation de await
en componentDidMount
plutôt que then
y catch
. Pour ce faire, vous devez imbriquer un async
IIFE et s'assurer que cette fonction ne peut pas être lancée. ( componentDidMount
elle-même ne peut pas être async
rien ne pourra consommer cette promesse). Par exemple :
class App extends React.Component{
async getData() {
const res = await axios('/data');
return await res.json(); // (Or whatever)
}
constructor(...args) {
super(...args);
this.state = {data: null};
}
componentDidMount() {
if (!this.state.data) {
(async () => {
try {
this.setState({data: await this.getData()});
} catch (e) {
//...handle the error...
}
})();
}
}
render() {
return (
<div>
{this.state.data ? <em>Loading...</em> : this.state.data}
</div>
);
}
}
0 votes
Render() fonctionne très bien, comme je l'ai clairement indiqué, je suis en mesure d'obtenir des détails lorsque j'utilise $.ajax(). Quel code supplémentaire dois-je ajouter ? Il s'agit d'une simple demande d'accès au serveur utilisant les normes ES7.
0 votes
Idéalement, mettez à jour votre question avec un exécutable exemple minimal reproductible Démontrer le problème en utilisant un placeholder pour l'ajax (par exemple,
setTimeout
ou similaire), en utilisant les Stack Snippets (le[<>]
bouton de la barre d'outils). Stack Snippets prend en charge React, y compris JSX ; voici comment faire .0 votes
...mais le code ajouté rend les choses absolument claires :-)
8 votes
FYI,
async/await
fait partie de l'ES2017, no ES7 (ES2016).0 votes
Merci pour ces informations.