Puppeteer networkidle0 的实现原理

12 min read
let networkIdleTimeout; // 用于设置500ms的定时器
let inflightRequests = 0; // 用于记录当前的网络连接数

// 当页面发起一个网络请求时,执行以下的函数
function onRequest() {
  // 如果之前没有网络连接,就取消定时器
  if (inflightRequests === 0) {
    clearTimeout(networkIdleTimeout);
  }
  // 网络连接数加一
  inflightRequests++;
}

// 当页面收到一个网络响应时,执行以下的函数
function onResponse() {
  // 网络连接数减一
  inflightRequests--;
  // 如果当前没有网络连接,就设置一个500ms的定时器
  if (inflightRequests === 0) {
    networkIdleTimeout = setTimeout(() => {
      // 定时器到期时,认为导航完成
      resolveNavigation();
    }, 500);
  }
}