在全局反应应用程序中从异步函数捕获错误

时间:2019-11-22 10:45:40

标签: javascript reactjs error-handling

我正在尝试添加一个全局错误处理程序,以便可以捕获所有错误并向用户显示一些通知。

window.addEventListener("unhandledrejection", e => {
  console.log("unhandledrejection", e);
});

window.addEventListener("error", e => {
  console.log("error", e);
});

但这似乎无法捕获异步函数中的错误:

function App() {
  async function asyncAction() {
    throw new Error("async error"); // This error can't be caught globally
  }
  function syncAction() {
    throw new Error("sync error");
  }
  return (
    <div className="App">
      <button onClick={asyncAction}>async</button>
      <button onClick={syncAction}>sync</button>
    </div>
  );
}

代码沙箱位于此处:CodeSandbox

1 个答案:

答案 0 :(得分:0)

您必须等待async函数返回的promise结果,否则错误将不会传播到全局侦听器。

  

但是异步功能仍然有可能误吞   错误。以并行异步功能为例。如果没有   等待(或返回)Promise.all([])调用的结果,任何错误   不会被传播。虽然parallelPromise示例似乎   简单,它根本不处理错误!这样做将需要   类似的返回Promise.all([])。

You can read more here in the MDN web docs.

在您的代码沙箱中,我可以通过重写asyncAction函数来捕获异步错误:

#use