javascript-请求处理

两种方式

  • ajax
  • fetch

如何取消请求?

  • xhr.abort
  • AbortController api

axios 请求函数示例:

 import type { AxiosRequestConfig } from "axios";// 用于存储每个请求的标识和取消函数
 const pendingMap = new Map<string, AbortController>();const getPendingUrl = (config: AxiosRequestConfig): string => {
   return [config.method, config.url].join("&");
 };export class AxiosCanceler {
   /**
    * 添加请求
    * @param config 请求配置
    */
   public addPending(config: AxiosRequestConfig): void {
     this.removePending(config);
     const url = getPendingUrl(config);
     const controller = new AbortController();
     config.signal = controller.signal;
     if (!pendingMap.has(url)) {
       // 如果当前请求不在等待中,将其添加到等待中
       pendingMap.set(url, controller);
     }
   }/**
    * 清除所有等待中的请求
    */
   public removeAllPending(): void {
     pendingMap.forEach((abortController) => {
       if (abortController) {
         abortController.abort();
       }
     });
     this.reset();
   }/**
    * 移除请求
    * @param config 请求配置
    */
   public removePending(config: AxiosRequestConfig): void {
     const url = getPendingUrl(config);
     if (pendingMap.has(url)) {
       // 如果当前请求在等待中,取消它并将其从等待中移除
       const abortController = pendingMap.get(url);
       if (abortController) {
         abortController.abort(url);
       }
       pendingMap.delete(url);
     }
   }/**
    * 重置
    */
   public reset(): void {
     pendingMap.clear();
   }
 }

axios 底层还是基于 abort 来实现,源码分析参考 https://github.com/GitHubJackson/sc.js/issues/3

ajax 取消请求示例

function getWithCancel(url, token) { // the token is for cancellation
   var xhr = new XMLHttpRequest;
   xhr.open("GET", url);
   return new Promise(function(resolve, reject) {
      xhr.onload = function() { resolve(xhr.responseText); });
      token.cancel = function() {  // SPECIFY CANCELLATION
          xhr.abort(); // abort request
          reject(new Error("Cancelled")); // reject the promise
      };
      xhr.onerror = reject;
   });
};

fetch 示例

const data = {};
// 构造器对象
let controller = null;

// 按钮点击
button.addEventListener('click', function (event) {
  // 构造 AbortController 对象
  if (data.controller) {
    controller = data.controller;
  } else {
    controller = new AbortController();
    data.controller = controller;
  }
  // 如果正在请求,终止
  if (data.loading) {
    controller.abort();
    // 构建新的 AbortController
    controller = new AbortController();
    data.controller = controller;
  }
  data.loading = true;

  // 请求逻辑
  fetch('./getVal.php?val=' + event.target.value, {
    signal: controller.signal
  }).then(res =&gt; res.text()).then(text =&gt; {
    // text 就是返回内容
  });
});
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值