如何使用AbortController取消连续请求时的上一次未完成请求

117 阅读1分钟

场景描述

在搜索框进行输入时,在防抖处理下每次搜索都会有相关联的搜索结果进行展示,但是可能会因为网络波动等原因导致我们在发送新的请求时,上一次的请求还没有响应,可能会出现上次请求覆盖本次请求的情况,所以我们需要在发送新的请求时将上次请求取消掉。

解决方式

使用AbortController对象,它是一个控制器对象,可以根据需要中止一个或多个 Web 请求。

构造函数

let abortControllerInstance = new AbortController()

属性

AbortController.signal:返回一个 AbortSignal 对象实例,可以用它与一个 DOM 请求进行通信或者中止该请求。

方法

AbortController.abort:中止一个尚未完成的 Web(网络)请求。

代码示例

let abortControllerInstance = null;
function searchData() {
  // 如果存在AbortController实例,则终止请求
  if (abortControllerInstance) {
    abortControllerInstance.abort();
  }
  abortControllerInstance = new AbortController();

  fetch(`/search/data${text}`, {
    // 携带signal,
    signal: abortControllerInstance.signal,
  })
    .then((res) => {
      // 请求成功处理
      updateList(res);
    })
    .catch((err) => {
      // 请求失败处理
      handleError(err);
    });
}

MDN:developer.mozilla.org/zh-CN/docs/…