2017-11-03 6 views
2

Reactでフェッチエラーをキャッチする正しい方法は?私はシンプルで、このように見える部品に反応している

class Test extends React.Component { 
    componentDidMount() { 
    fetch('/some-url-here') 
     .then((data) => { 
     this.setState({ data }); 
     }) 
     .catch(() => { 
     alert('failed to fetch'); 
     }); 
    } 

    render() { 
    // render the data here 
    } 
} 

をこれに伴う問題はcatchだけでエラーをフェッチキャッチしていないということです。 renderにスローされた例外もキャッチします!いくつかのデータを取り出してフェッチ・エラーを処理する単純なコンポーネントを作成する正しい方法は何でしょうか?

+0

あなたは、独自の機能に出てフェッチ引っ張るとcomponentDidMountで呼び出すと、それでもレンダリングエラーをキャッチしますか? – webdevdani

+0

'.catch'の代わりに' .then'の第2のコールバックを使うと、それでもまだそれがキャッチされます。 – Vic

+2

? [doc](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/then) –

答えて

2
class Test extends React.Component { 
    componentDidMount() { 
    fetch('/some-url-here') 
     .then((data) => { 
     this.setState({ data }); 
     }, (error) => { 
     if (error) { 
      // handle error here 
     } 
     }); 
    } 

    render() { 
    // render the data here 
    } 
} 

2番目のコールバックの代わりにキャッチを使用すると、setStateメソッドで発生した可能性のあるエラーは処理されません。レンダリングメソッドのエラーを独自の方法で取り込むことができます。 詳細については、Dan Abramovのこのツイートを読んでください。

Dan's Tweet

+0

ああ完璧、ありがとう! – Vic

+0

実際には、エラーコールバックを '.then'に渡すことを意味すると思いますか? 'then'の最初のコールバックの中で' error'ではなく? – Vic

+0

@Vic Yep!私のコードを修正しました。警告ありがとう – gca

2

あなたが16以降に反応している場合は、エラー境界とcomponentDidCatchを使用することを検討してください。あなたを助けるかもしれない

class ErrorBoundary extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { hasError: false }; 
    } 

    componentDidCatch(error, info) { 
    // Display fallback UI 
    this.setState({ hasError: true }); 
    // You can also log the error to an error reporting service 
    logErrorToMyService(error, info); 
    } 

    render() { 
    if (this.state.hasError) { 
     // You can render any custom fallback UI 
     return <h1>Something went wrong.</h1>; 
    } 
    return this.props.children; 
    } 
} 

// Then you can use it as a regular component: 

<ErrorBoundary> 
    <MyWidget /> 
</ErrorBoundary> 

良いリソース:ダン・アブラモフ監督のブログから例

+0

私はフェッチエラーをキャッチすることに興味がありますが、これとどのように結びついているのかよく分かりません – Vic

関連する問題