Pembaruan April 2020:
Masalah ini tampaknya telah diperbaiki pada React 16.13.1 terbaru, lihat contoh kotak pasir ini . Terima kasih kepada @abernier karena telah menunjukkan ini.
Saya telah melakukan beberapa penelitian, dan saya telah menemukan satu perbedaan penting:
Bereaksi tidak memproses kesalahan dari metode siklus hidup async.
Jadi, jika Anda menulis sesuatu seperti ini:
componentDidMount()
{
throw new Error('I crashed!');
}
maka kesalahan Anda akan ditangkap oleh batas kesalahan , dan Anda dapat memprosesnya dan menampilkan pesan yang anggun.
Jika kita mengubah kode seperti ini:
async componentDidMount()
{
throw new Error('I crashed!');
}
yang setara dengan ini:
componentDidMount()
{
return Promise.reject(new Error('I crashed!'));
}
maka kesalahan Anda akan ditelan diam-diam . Malu pada Anda, Bereaksi ...
Jadi, bagaimana kita memproses kesalahan daripada? Satu-satunya cara tampaknya menjadi tangkapan eksplisit seperti ini:
async componentDidMount()
{
try
{
await myAsyncFunction();
}
catch(error)
{
//...
}
}
atau seperti ini:
componentDidMount()
{
myAsyncFunction()
.catch(()=>
{
//...
});
}
Jika kita masih ingin kesalahan kita mencapai batas kesalahan, saya dapat memikirkan trik berikut:
- Tangkap kesalahan, buat penangan kesalahan mengubah status komponen
- Jika negara menunjukkan kesalahan, buang itu dari
render
metode
Contoh:
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>;
}
}