当promise中有错误时,不会调用componentDidCatch

时间:2017-10-23 11:53:36

标签: reactjs react-fiber

根据它所说的新react 16 release doc

“React 16将在渲染过程中发生的所有错误打印到开发中的控制台,即使应用程序意外吞下它们。”

我有组件和组件。我在那个承诺块中触发了一个错误。但它会调用promise的catch方法,父类的componentDidCatch不会被调用。我不确定这是否是预期的行为。

这是jsfiddle https://jsfiddle.net/john1jan/Luktwrdm/14/

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

  render() {
    if(this.state.hasError){
      return <div>Something went wrong</div>
    }

    return (
      <div>
        <h1>I am parent</h1>
        <Child></Child>
      </div>
    );
  }
  componentDidCatch(error,errorInfo){
    this.setState({
      hasError:true
    })
  }
}

class Child extends React.Component {

  render() {
    return (
      <div>
        <h1>I am child</h1>
      </div>
    );
  }

  componentDidMount(){
    fetch("https://jsonplaceholder.typicode.com/posts").then((response) => {
      throw new Error("I am the error in promise");
    }).catch((error)=>{
      console.log("Error caught in catch",error);
    })
    ;
  }
}

ReactDOM.render(<Parent name="world"/>, 
document.getElementById('container'));

2 个答案:

答案 0 :(得分:3)

只想指出任何进入这个问题寻找答案的人。

  

React 16将呈现期间发生的所有错误打印到开发中的控制台,即使应用程序意外吞下它们也是如此。

componentDidCatch只会在渲染生命周期方法中触发。

由于您的错误被抛入承诺。它是异步,并且不会成为渲染生命周期的一部分,因此您需要自己处理错误。

答案 1 :(得分:0)

你正在捕捉错误并且返回一个catch是一个承诺,所以你不再有错误,如果你删除了componentDidMount中的fetch上的.catch,这应该可行!