s AbortController 接口取消多次请求 取消上次请求

这篇具有很好参考价值的文章主要介绍了s AbortController 接口取消多次请求 取消上次请求。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

AbortController 是一个 JavaScript API,它允许您在客户端中止一个或多个 Fetch 请求。这个 API 是 Fetch API 的一部分,并且与 AbortSignal 对象一起使用,以提供一种机制来控制请求的生命周期。

以下是 AbortController 的基本用法:

创建一个 AbortController 实例:这将创建一个新的控制器对象,它可以用来中止一个或多个请求。

const controller = new AbortController();

获取 AbortSignal 对象:从 AbortController 实例中获取 signal 属性,该属性返回一个 AbortSignal 对象。

const { signal } = controller;

将 AbortSignal 传递给 fetch 请求:在发起请求时,将 AbortSignal 作为选项对象的一部分传递给 fetch 函数。

fetch(url, { signal: signal })
  .then(response => response.json())
  .catch(error => {
    if (error.name === 'AbortError') {
      // 处理请求被中止的情况
      console.log('Fetch aborted');
    } else {
      // 处理其他错误
      console.error(error);
    }
  });

中止请求:当需要中止请求时,调用 AbortController 的 abort 方法。

controller.abort();

调用 abort 方法后,AbortSignal 对象的状态将变为 “aborted”,并且 fetch 请求将被中止。如果请求已经被中止,它将抛出一个 AbortError。

AbortController 非常有用,特别是当你需要实现超时机制或者用户取消了某个操作时,需要立即停止正在进行的网络请求。

请注意,AbortController 仅适用于 fetch 请求,对于其他类型的异步操作,如 XMLHttpRequest,需要使用不同的方法来实现中止功能。文章来源地址https://www.toymoban.com/news/detail-857718.html

示例代码

<script setup lang="ts">
import HelloWorld from './components/HelloWorld.vue'

import { ref } from 'vue'

const loading = ref(false)
const inputVal = ref('')
const resText = ref({})


async function queryHandler(t) {
  // console.log(inputVal.value);

  try {
    loading.value = true
    const res = await requestWithFetchAbort(inputVal.value)
    console.log(res);
    resText.value = res
    loading.value = false
  } catch (e) {
    if(e.name !== 'AbortError') {
      console.error(e);
      loading.value = false
    }
  }
}

function request(keyword: string) {
  // return new Promise((resolve,reject) => {
  //   fetch('http://127.0.0.1:9090/api?keyword='+keyword)
  //   .then(res => res.json())
  //   .then(data=> {
  //     console.log(data);

  //     resolve(data)
  //   })
  //   .catch(err => {
  //     reject(err)
  //   })
  // })

  return fetch('http://127.0.0.1:9090/api?keyword=' + keyword).then(res => res.json())
}

let currentAbortController: AbortController | null = null
function requestWithFetchAbort(keyword: string) {
  // 取消上次未完成的请求
  if (currentAbortController) {
    currentAbortController.abort()
  }

  // 创建新的 AbortController
  currentAbortController = new AbortController()

  return fetch('http://127.0.0.1:9090/api?keyword=' + keyword, {
    signal: currentAbortController.signal
  }).then(res => res.json())
}
</script>

<template>
  <!-- <div>
    <a href="https://vitejs.dev" target="_blank">
      <img src="/vite.svg" class="logo" alt="Vite logo" />
    </a>
    <a href="https://vuejs.org/" target="_blank">
      <img src="./assets/vue.svg" class="logo vue" alt="Vue logo" />
    </a>
  </div>
  <HelloWorld msg="Vite + Vue" /> -->

  <!-- <button>点击发送请求</button> -->
  <input type="text" v-model="inputVal" @input="queryHandler">
  <p v-if="loading">正在发送请求 ...</p>
  <h3 style="color:blueviolet">结果: {{ resText }}</h3>
</template>

<style scoped>
.logo {
  height: 6em;
  padding: 1.5em;
  will-change: filter;
  transition: filter 300ms;
}

input {
  padding: 8px 30px;
}

.logo:hover {
  filter: drop-shadow(0 0 2em #646cffaa);
}

.logo.vue:hover {
  filter: drop-shadow(0 0 2em #42b883aa);
}
</style>


到了这里,关于s AbortController 接口取消多次请求 取消上次请求的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • php使用guzzle http发送并发接口请求

    在 PHP 中, Guzzle 是一个功能强大且流行的 HTTP 客户端,提供了方便的接口来发送 HTTP 请求并处理响应,本人非常喜欢这个包且重度依赖。 以下是使用 Guzzle 发送并发请求的基本示例: 

    2024年01月16日
    浏览(35)
  • php 接口请求一次,controller调用了两次。

    这几天开发一个数据导出功能 由于是数据导出,所以有点慢。然后发现一个问题,前端只请求一次,controller却收到了两次请求。而且第二次请求i必定失败 这就悲催了。脑子懵懵的! 由于我这就是个小活儿,于是环境就是使用的nginx+fastcgi 网上搜索了一圈,大多都是说跨域的

    2024年02月06日
    浏览(28)
  • axios添加缓存请求,防止多次请求,单页面多个同一组件造成多次请求解决方案

    在 vue 开发中,我们偶尔会遇到相同组件多次调用一个请求的问题,即使添加了缓存,但在第一次调用时也会出现这类问题,这种问题的根源往往是由于第一个组件发起的请求没有返回数据,第二个组件没有在缓存中获取到数据而重新发起请求。 解决这种问题我们往往可以分

    2024年02月07日
    浏览(30)
  • Vue缓存字典值减少网络请求次数,解决同样参数并发请求多次

    在一些项目里,我们可能有着大量的下拉框,而这些下拉框的数据就来源于我们后端接口返回的字典信息。于是,画风可能是这样的,每次下拉,你都需要请求一次字典接口拿到这些数据,于是每次组件刷新都会重复请求接口,造成性能上的浪费,如下图所示: 那么,我们可

    2024年02月14日
    浏览(46)
  • Java实现Http多次请求复用同一连接

    早在HTTP/1.0时代,每次HTTP请求都要创建一个连接,而创建连接的过程需要消耗资源和时间,代价相对昂贵,为了减少资源消耗,缩短响应时间,就需要重用连接。在后来的HTTP/1.1中,引入了连接复用的机制,Http Header中加入Connection: keep-alive来告诉对方这个请求响应完成后先不

    2024年02月03日
    浏览(28)
  • PostMan传时间参数&一次性发送多次请求

    request body: { “id”: “demoData”, “date”: “{{date}}” // “timeStamp”: “{{timeStamp}}” } Pre-request Script: Datel类型 postman.setGlobalVariable(“date”, Date.parse(new Date())) 或 postman.setGlobalVariable(“date”, Date.parse(new Date(“2023-09-07”))) TimeStamp类型 timeStamp=Math.round(new Date().getTime()); postman.setGl

    2024年02月08日
    浏览(23)
  • Postman一个接口多次循环调用

    一、在Postman里面创建文件夹,在文件夹里面创建请求 二、将请求的参数,进行参数化 aa:“{ {a}}”, bb:“{ {b}}” 参数名是aa和bb a和b就是csv文件里面的那两列参数 最好还要在Tests里面写断言,不然运行之后,不知道有没有成功 三、创建csv文件,将替换的参数写在里面 第一列首

    2023年04月08日
    浏览(68)
  • RuoYi开发实战- PostMan请求接口

    最近在学习若依这个开源项目,在调试接口时遇到一个小坎。默认的情况下接口是无法直接请求的,请求会报以下的错误: 在一些场景下还是挺不方便的。那么如果想在postman中调试若依的接口应该如何实现呢? 想要解决这个问题,那么就要先了解若依的登录机制。首先若依

    2024年02月11日
    浏览(25)
  • axios使用axiosSource.cancel取消请求后怎么恢复请求,axios取消请求和恢复请求实现

    在前端做大文件分片上传,或者其它中断请求时,需要暂停或重新请求,比如这里大文件上传时,可能会需要暂停、继续上传,如下GIF演示: 这里不详细说文件上传的处理和切片细节,后续有时间在出一篇,大文件上传,切片上传、断点续传、秒传等😀。 不扯远了,紧接本

    2024年02月12日
    浏览(28)
  • uniapp开发笔记(1)——uview API接口请求

    在请求后端的时候,需要带请求头去访问,在uview里写了http请求可以传递的参数:详情参考:Http请求 | uView 2.0 - 全面兼容nvue的uni-app生态框架 - uni-app UI框架 实战代码示例:  在项目中,请求接口的时候,要做的是渲染列表,有的时候要给后台发一个参数,在点击某个数据的

    2024年02月17日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包