Nisan 2020 Güncellemesi:
Sorun en son React 16.13.1'de düzeltilmiş gibi görünüyor, bu sanal alan örneğine bakın . @ Abernier'e bunu işaret ettiği için teşekkürler.
Biraz araştırma yaptım ve önemli bir fark buldum:
React, eşzamansız yaşam döngüsü yöntemlerinden gelen hataları işlemez.
Öyleyse, böyle bir şey yazarsanız:
componentDidMount()
{
throw new Error('I crashed!');
}
daha sonra, hatanız hata sınırı tarafından yakalanır ve bunu işleyebilir ve zarif bir mesaj görüntüleyebilirsiniz.
Kodu şu şekilde değiştirirsek:
async componentDidMount()
{
throw new Error('I crashed!');
}
buna eşdeğer olan:
componentDidMount()
{
return Promise.reject(new Error('I crashed!'));
}
o zaman hatanız sessizce yutulacak . Yazıklar olsun sana React ...
Öyleyse, hataları daha sonra nasıl işleriz? Tek yol böyle açık bir şekilde yakalamak gibi görünüyor:
async componentDidMount()
{
try
{
await myAsyncFunction();
}
catch(error)
{
//...
}
}
veya bunun gibi:
componentDidMount()
{
myAsyncFunction()
.catch(()=>
{
//...
});
}
Hala hatamızın hata sınırına ulaşmasını istiyorsak, şu numarayı düşünebilirim:
- Hatayı yakalayın, hata işleyicinin bileşen durumunu değiştirmesini sağlayın
- Durum bir hata gösteriyorsa, bunu
render
yöntemden atın
Misal:
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>;
}
}