Axios拦截器不会立即导航到带有“useNavigation”的错误页面

esyap4oy  于 8个月前  发布在  iOS
关注(0)|答案(1)|浏览(86)

我在我的React项目中使用axios。在拦截器中,当我发现服务器错误时,我用useNavigate导航到错误页面。我的代码看起来像这样。

export const AxiosInstanceProvider: FC<AxiosInstanceProviderProps> = ({
  children,
}) => {
  const navigate = useNavigate();
  useLayoutEffect(() => {
    const responseInterceptorId = instance.interceptors.response.use(
    (response) => {
      return response;
    },
    (error: AxiosError) => {
      const status = error.response?.status;
      if (!status || isServerError(status)) {
        navigate("/error", {
          state: {
            error,
          },
        });
      }
      return Promise.reject(error);
    }
  );

    return function cleanup() {
      instance.interceptors.response.eject(responseInterceptorId);
    };
  }, [navigate]);

  return <>{children}</>;
};

字符串
问题是它导航到页面,但仍然转到catch块,例如,显示snackbar,这个snackbard开始出现在错误页面上,或者在我在组件中定义的屏幕上抛出Error。这意味着它不会立即导航,正如我所期望的那样。

yshpjwxd

yshpjwxd1#

为了确保导航后的代码不会执行,可以在导航后返回一个rejected promise。

const navigate = useNavigate();
  useLayoutEffect(() => {
    const responseInterceptorId = instance.interceptors.response.use(
      (response) => {
        return response;
      },
      (error: AxiosError) => {
        const status = error.response?.status;
        if (!status || isServerError(status)) {
          navigate("/error", {
            state: {
              error,
            },
          });

          // Return a rejected promise to prevent further execution
          return Promise.reject(error);
        }

        return Promise.reject(error);
      }
    );

字符串

相关问题