Skip to content

JavaScript

ES6+ 语法、常见的工具函数、编程模式等

js 监听网络返回状态码

XMLHttpRequest 请求

ts
// 定义 XMLHttpRequest 监听器类型
type XHRListener = (method: string, url: string, status: number) => void

// 保存原始的 XMLHttpRequest 对象
const originalXhrOpen: typeof XMLHttpRequest.prototype.open = XMLHttpRequest.prototype.open
const originalXhrSend: typeof XMLHttpRequest.prototype.send = XMLHttpRequest.prototype.send

// 重写 open 方法
XMLHttpRequest.prototype.open = function (method: string, url: string) {
  console.log('发起了 XMLHttpRequest 请求:', method, url)

  // 调用原始的 open 方法
  originalXhrOpen.call(this, method, url)
}

// 重写 send 方法
XMLHttpRequest.prototype.send = function (body?: Document | BodyInit | null) {
  // 保存当前 XMLHttpRequest 实例
  const xhr = this

  // 拦截请求发送前的操作
  xhr.onreadystatechange = function () {
    if (xhr.readyState === 4) {
      console.log('XMLHttpRequest 请求完成:', xhr.status)

      // 这里可以根据需要处理请求完成后的逻辑
      if (xhr.status === 401)
        console.log('返回状态码为401,进行逻辑处理')
      // 进行逻辑处理,例如跳转到登录页面
    }
  }

  // 调用原始的 send 方法
  originalXhrSend.call(this, body)
}

// 示例:发起一个 XMLHttpRequest 请求
const xhr = new XMLHttpRequest()
xhr.open('GET', 'https://jsonplaceholder.typicode.com/posts/1', true)
xhr.send()

Fetch API 请求

ts
// 定义 Fetch 监听器类型
type FetchListener = (input: RequestInfo, init?: RequestInit, response?: Response) => Promise<Response>

// 保存原始的 fetch 函数
const originalFetch: FetchListener = window.fetch.bind(window)

// 重写 fetch 方法
window.fetch = async function (input: RequestInfo, init?: RequestInit): Promise<Response> {
  console.log('发起了 Fetch 请求:', input)

  try {
    // 调用原始的 fetch 方法
    const response = await originalFetch(input, init)

    console.log('Fetch 请求完成:', input)

    // 这里可以根据需要处理请求完成后的逻辑
    if (response.status === 401)
      console.log('返回状态码为401,进行逻辑处理')
    // 进行逻辑处理,例如跳转到登录页面

    return response
  }
  catch (error) {
    console.error('Fetch 请求出错:', input, error)
    throw error
  }
}

// 示例:发起一个 Fetch 请求
fetch('https://jsonplaceholder.typicode.com/posts/1')
  .then((response) => {
    return response.json()
  })
  .then((data) => {
    console.log('Fetch 请求结果:', data)
  })
  .catch((error) => {
    console.error('Fetch 请求出错:', error)
  })

Promise 的 resolve 是不可逆的

Promise 的 resolve 是不可逆的时,意味着一旦 Promise 被 resolve,就无法再次更改其状态。这是 Promise 设计上的一个关键特性,确保了异步操作的可靠性和一致性。

ts
// 创建一个 Promise,模拟异步操作
const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('Success')
  }, 1000)
})

// 第一个 then 处理 resolve 的结果
promise.then((result) => {
  console.log('第一个 then:', result) // 输出:Success

  // 尝试再次 resolve 这个 Promise
  promise.then((innerResult) => {
    console.log('尝试再次 resolve:', innerResult) // 不会执行这里的代码
  })

  // 尝试在第一个 then 中 reject 这个 Promise
  // 这也不会改变 Promise 的状态
  reject('Error') // 不会执行这里的代码
}).catch((error) => {
  console.log('Catch 处理错误:', error) // 不会执行这里的代码
})

fetch 读取 xml 文件

js
async function fetchAndEncodeXML() {
  try {
    // 假设你的 XML 文件位于 public 目录下,路径为 /public/data.xml
    const response = await fetch('/data.xml')
    if (!response.ok) {
      throw new Error('Network response was not ok')
    }
    let xmlContent = await response.text()
    // 去除空格和换行符
    xmlContent = xmlContent.replace(/\s+/g, ' ').trim()
    this.encodedXML = encodeURIComponent(xmlContent)
  }
  catch (error) {
    console.error('Error fetching XML file:', error)
  }
}

基于 MIT 许可发布