अद्यतन अप्रैल 2020:
यह मुद्दा नवीनतम रिएक्ट 16.13.1 में तय किया गया है, यह सैंडबॉक्स उदाहरण देखें । इसे इंगित करने के लिए @abernier को धन्यवाद।
मैंने कुछ शोध किए हैं, और मुझे एक महत्वपूर्ण अंतर मिला है:
रिएक्ट async जीवन चक्र विधियों से त्रुटियों को संसाधित नहीं करता है।
तो, अगर आप ऐसा कुछ लिखते हैं:
componentDidMount()
{
throw new Error('I crashed!');
}
तब आपका त्रुटि त्रुटि सीमा से पकड़ा जाएगा , और आप इसे संसाधित कर सकते हैं और एक सुंदर संदेश प्रदर्शित कर सकते हैं।
यदि हम इस तरह कोड बदलते हैं:
async componentDidMount()
{
throw new Error('I crashed!');
}
जो इस के बराबर है:
componentDidMount()
{
return Promise.reject(new Error('I crashed!'));
}
तब आपकी त्रुटि चुपचाप निगल ली जाएगी । आप पर शर्म आती है, प्रतिक्रिया ...
तो, हम त्रुटियों को कैसे संसाधित करते हैं? एकमात्र तरीका इस तरह स्पष्ट रूप से पकड़ा जाना प्रतीत होता है:
async componentDidMount()
{
try
{
await myAsyncFunction();
}
catch(error)
{
//...
}
}
या इस तरह:
componentDidMount()
{
myAsyncFunction()
.catch(()=>
{
//...
});
}
यदि हम अभी भी अपनी त्रुटि को त्रुटि सीमा तक पहुँचाना चाहते हैं, तो मैं निम्नलिखित चाल के बारे में सोच सकता हूँ:
- त्रुटि को पकड़ें, त्रुटि हैंडलर को घटक स्थिति बदलें
- यदि राज्य किसी त्रुटि को इंगित करता है, तो इसे
render
विधि से फेंक दें
उदाहरण:
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>;
}
}