Mise à jour en avril 2020 : Le problème semble avoir été corrigé dans la dernière version de React 16.13.1. cet exemple de bac à sable . Merci à @abernier de l'avoir signalé.
J'ai fait quelques recherches, et j'ai trouvé une différence importante : React ne traite pas les erreurs provenant des méthodes asynchrones du cycle de vie.
Donc, si vous écrivez quelque chose comme ça :
componentDidMount()
{
throw new Error('I crashed!');
}
alors votre erreur sera prise en compte par le limite d'erreur et vous pouvez le traiter et afficher un message de grâce.
Si nous changeons le code comme ceci :
async componentDidMount()
{
throw new Error('I crashed!');
}
ce qui est équivalent à ceci :
componentDidMount()
{
return Promise.reject(new Error('I crashed!'));
}
puis votre erreur sera silencieusement avalée . Honte à toi, React...
Alors, comment traiter les erreurs que ? Le seul moyen semble être une capture explicite comme celle-ci :
async componentDidMount()
{
try
{
await myAsyncFunction();
}
catch(error)
{
//...
}
}
ou comme ça :
componentDidMount()
{
myAsyncFunction()
.catch(()=>
{
//...
});
}
Si nous voulons toujours que notre erreur atteigne la limite d'erreur, je peux penser à l'astuce suivante :
- Attrapez l'erreur, faites en sorte que le gestionnaire d'erreur change l'état du composant.
- Si l'état indique une erreur, lancez-la à partir de la fonction
render
méthode
Exemple :
class BuggyComponent extends React.Component {
constructor(props) {
super(props);
this.state = { error: null };
}
buggyAsyncfunction(){ return Promise.reject(new Error('I crashed async!'));}
async componentDidMount() {
try
{
await this.buggyAsyncfunction();
}
catch(error)
{
this.setState({error: error});
}
}
render() {
if(this.state.error)
throw this.state.error;
return <h1>I am OK</h1>;
}
}
2 votes
Les "bonnes pratiques" sont une question d'opinion. Est-ce que cela fonctionne ? Oui.
2 votes
Voici un bon article qui montre pourquoi l'attente asynchrone est une bonne option par rapport aux promesses. hackernoon.com/
0 votes
Utilisez simplement redux-thunk, cela résoudra le problème
3 votes
@TilakMaddy Pourquoi supposez-vous que toutes les applications react utilisent redux ?
0 votes
@Mirakurun pourquoi l'ensemble de stack overflow a supposé que j'utilisais jQuery alors que je posais des questions simples sur javascript à l'époque ?
0 votes
@TilakMaddy Je ne sais pas, mon pote, je ne sais pas...