You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何处理Next.js router.refresh引发的net::ERR_NETWORK_IO_SUSPENDED错误?

解决方案:避免休眠时router.refresh导致的网络错误崩溃

针对你遇到的设备休眠后net::ERR_NETWORK_IO_SUSPENDED错误,以下是几个不破坏router.refresh缓存与状态保留特性的可行方案:

方案1:通过Page Visibility API控制定时器启停

设备休眠时浏览器页面会进入hidden状态,利用这个API可以精准暂停定时器,恢复可见时重启,从根源避免休眠时触发网络请求:

import { useRouter, useEffect } from 'next/router';

const YourComponent = () => {
  const router = useRouter();
  let interval = null;

  const startRefresh = () => {
    interval = setInterval(() => {
      router.refresh();
    }, REFRESH_RATE_MIL);
  };

  const stopRefresh = () => {
    if (interval) {
      clearInterval(interval);
      interval = null;
    }
  };

  useEffect(() => {
    // 初始启动定时器
    startRefresh();

    // 监听页面可见性变化
    const handleVisibilityChange = () => {
      if (document.hidden) {
        stopRefresh();
      } else {
        startRefresh();
      }
    };

    document.addEventListener('visibilitychange', handleVisibilityChange);

    return () => {
      stopRefresh();
      document.removeEventListener('visibilitychange', handleVisibilityChange);
    };
  }, []);

  return <div>Your content</div>;
};

方案2:结合网络状态检测与错误捕获

即使定时器没暂停,也可以通过navigator.onLine判断网络可用性,同时给router.refresh包裹错误捕获,确保单个请求失败不会导致应用崩溃:

import { useRouter, useEffect } from 'next/router';

const YourComponent = () => {
  const router = useRouter();
  let interval = null;

  const safeRefresh = async () => {
    // 仅在网络在线时执行刷新
    if (!navigator.onLine) return;
    try {
      await router.refresh();
    } catch (err) {
      // 捕获网络错误,仅做日志或忽略,不抛出
      if (err.message.includes('ERR_NETWORK_IO_SUSPENDED')) {
        console.warn('网络暂停,跳过本次刷新');
      }
    }
  };

  useEffect(() => {
    interval = setInterval(safeRefresh, REFRESH_RATE_MIL);

    return () => {
      clearInterval(interval);
    };
  }, []);

  return <div>Your content</div>;
};

方案3:休眠恢复后校准刷新间隔

设备休眠时定时器可能会滞后,恢复后一次性触发多个刷新请求,校准间隔可以避免这种情况:

import { useRouter, useEffect } from 'next/router';

const YourComponent = () => {
  const router = useRouter();
  let interval = null;
  let lastRefreshTime = Date.now();

  const scheduleNextRefresh = () => {
    const elapsed = Date.now() - lastRefreshTime;
    // 计算剩余时间,避免休眠后立即触发刷新
    const delay = Math.max(0, REFRESH_RATE_MIL - elapsed);
    interval = setTimeout(() => {
      router.refresh();
      lastRefreshTime = Date.now();
      scheduleNextRefresh();
    }, delay);
  };

  useEffect(() => {
    scheduleNextRefresh();

    const handleVisibilityChange = () => {
      if (!document.hidden) {
        // 恢复可见时重新校准
        if (interval) clearTimeout(interval);
        scheduleNextRefresh();
      }
    };

    document.addEventListener('visibilitychange', handleVisibilityChange);

    return () => {
      if (interval) clearTimeout(interval);
      document.removeEventListener('visibilitychange', handleVisibilityChange);
    };
  }, []);

  return <div>Your content</div>;
};

方案选择建议

  • 优先选方案1,从根源避免休眠时的网络请求,最稳定且性能开销最小;
  • 方案2作为补充,即使页面可见但网络临时中断也能避免崩溃;
  • 方案3适合对刷新时机精度要求较高的场景,避免休眠恢复后的密集请求。

内容的提问来源于stack exchange,提问作者yoty66

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 08:40:09