Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >如何取消 Fetch 请求

如何取消 Fetch 请求

作者头像
疯狂的技术宅
发布于 2020-03-26 07:38:55
发布于 2020-03-26 07:38:55
2.6K00
代码可运行
举报
文章被收录于专栏:京程一灯京程一灯
运行总次数:0
代码可运行

每日前端夜话第298篇

翻译:疯狂的技术宅

作者:David Walsh

来源:davidwalsh.name

正文共:1007 字

预计阅读时间:7 分钟

JavaScript 的 promise一直是该语言的一大胜利——它们引发了异步编程的革命,极大地改善了 Web 性能。原生 promise 的一个缺点是,到目前为止,还没有可以取消 fetch 的真正方法。JavaScript 规范中添加了新的 AbortController,允许开发人员使用信号中止一个或多个 fetch 调用。

以下是取消 fetch 调用的工作流程:

  • 创建一个 AbortController 实例
  • 该实例具有 signal 属性
  • signal 传递给 fetch option 的 signal
  • 调用 AbortControllerabort 属性来取消所有使用该信号的 fetch。

中止 Fetch

以下是取消 Fetch 请求的基本步骤:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const controller = new AbortController();
const { signal } = controller;

fetch("http://localhost:8000", { signal }).then(response => {
    console.log(`Request 1 is complete!`);
}).catch(e => {
    console.warn(`Fetch 1 error: ${e.message}`);
});

// Abort request
controller.abort();

abort 调用时发生 AbortError,因此你可以通过比较错误名称来侦听 catch 中的中止操作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
}).catch(e => {
    if(e.name === "AbortError") {
        // We know it's been canceled!
    }
});

将相同的信号传递给多个 fetch 调用将会取消该信号的所有请求:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
const controller = new AbortController();
const { signal } = controller;

fetch("http://localhost:8000", { signal }).then(response => {
    console.log(`Request 1 is complete!`);
}).catch(e => {
    console.warn(`Fetch 1 error: ${e.message}`);
});

fetch("http://localhost:8000", { signal }).then(response => {
    console.log(`Request 2 is complete!`);
}).catch(e => {
    console.warn(`Fetch 2 error: ${e.message}`);
});

// Wait 2 seconds to abort both requests
setTimeout(() => controller.abort(), 2000);

杰克·阿奇博尔德(Jack Archibald)在他的文章 Abortable fetch 中,详细介绍了一个很好的应用,它能够用于创建可中止的 Fetch,而无需所有样板:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
function abortableFetch(request, opts) {
  const controller = new AbortController();
  const signal = controller.signal;

  return {
    abort: () => controller.abort(),
    ready: fetch(request, { ...opts, signal })
  };
}

说实话,我对取消 Fetch 的方法并不感到兴奋。在理想的世界中,通过 Fetch 返回的 Promise 中的 .cancel() 会很酷,但是也会带来一些问题。无论如何,我为能够取消 Fetch 调用而感到高兴,你也应该如此!

原文链接

https://davidwalsh.name/cancel-fetch

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-03-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 前端先锋 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
面试官:如何中断一个网络请求?
金三银四,又快到了新的一年换工作的时候了,各种妖魔鬼怪的问题又出来了,比如 "如何根据手机壳颜色来动态改变手机主题颜色",虽然这个不是面试题,但是现在想想还是依然很好笑。
用户9078190
2022/10/28
1K0
面试官:如何中断一个网络请求?
使用Vue3.5的onWatcherCleanup封装自动cancel的fetch函数
大家好,我是欧阳,又跟大家见面啦! 欧阳写了一本vue3编译原理揭秘开源电子书,看完后可以让你对vue编译的认知有质的提升。并且这本书初、中级前端都能看懂,完全免费,只求一个star,点击文末的阅读原文跳转到电子书。
前端欧阳
2024/09/11
5280
使用Vue3.5的onWatcherCleanup封装自动cancel的fetch函数
AbortController的使用
提前终止后这个请求在 network 面板中的 status 显示为 canceled
ACK
2022/06/27
1.2K0
AbortController的使用
掌握JavaScript的异步编程,让你的代码更高效
在JavaScript中,异步编程是一种让应用程序在执行任务时不会阻塞主线程的编程范式。这意味着你的程序在等待长时间运行或外部操作完成的同时,仍然可以继续响应用户的交互并执行其他代码。这样做可以提高程序的响应速度和效率,尤其是在依赖大量网络请求、文件读写和用户交互的Web应用中,异步编程显得尤为重要。
前端达人
2024/11/25
5840
掌握JavaScript的异步编程,让你的代码更高效
前端开发者的 Kotlin 之旅:理解kotlin协程
对于前端开发者来说,进程、线程和协程的概念可能不太熟悉,因为浏览器和Node.js环境大多抽象了这些低层概念。让我们先来理解这些基本概念:
骑猪耍太极
2025/04/27
2180
前端开发者的 Kotlin 之旅:理解kotlin协程
Fetch API 教程
fetch()是 XMLHttpRequest 的升级版,用于在 JavaScript 脚本里面发出 HTTP 请求。
ruanyf
2020/12/30
3.3K0
Fetch API 教程
嗯,还在用Ajax嘛? Fetch了解一下呀!
「此刻你在沙漠里,因此你要潜心于沙漠之中。沙漠和世上其他东西一样,可以用来理解世界。你甚至不必理解沙漠,只要观察普通的沙粒就行,从中你可以看到天地万物的神奇之处。--------《牧羊少年的人生之旅》」
山河已无恙
2023/03/02
5.2K0
嗯,还在用Ajax嘛? Fetch了解一下呀!
使用装饰器模式让你的 fetch 更强大
fetch()的用法非常简单:调用fetch ('/movies.json')来启动请求。当请求完成时,您将获得一个Response对象,从中提取数据。
前端修罗场
2022/07/29
8680
如何更好的取消一个promise?
其实就像一个执行中的ajax要被取消一样,ajax有abort()进行取消,而且fetch api 也有了相关的规范-【AbortController】。
zz_jesse
2021/02/05
5.2K0
太冤了!群友因为这个功能的实现没回答好,到手的 offer 飞了。来看看 React19 如何解决
之前一个群友「三年经验」找我诉苦。说遇到一个奇葩的面试,千辛万苦过了三面,等对方团队着发 offer 的时候,结果对方 hr 说有另外一个人也过了面试,各方面都跟他差不多。所以对方团队不知道如何抉择,想要加面一个面试题,聊十分钟来最终决定选谁。
用户6901603
2024/05/09
1530
太冤了!群友因为这个功能的实现没回答好,到手的 offer 飞了。来看看 React19 如何解决
如何解决前端常见的竞态问题
会先后请求 data2 与 data3,分页器显示当前在第三页,并且进入 loading。
Leecason
2022/12/16
2.1K0
如何解决前端常见的竞态问题
AbortSignal:以前我没得选,现在我想中止promise
AbortSignal的出现使promise从语义上变为可中止的。并且,只要符合规范,所有异步操作都能变为「可中止的」。
公众号@魔术师卡颂
2021/10/12
1K0
使用 Fetch API 处理AI流式接口,实现在Web开发中前后端的数据交互与显示
在当今的 Web 开发中,前端与后端的数据交互是构建动态应用的核心。传统的页面刷新方式已经无法满足用户对流畅体验的需求,而 Fetch API 的出现为 JavaScript 带来了全新的生命力。本文将深入探讨 Fetch API 的工作原理、使用方法以及如何利用它与大模型服务(如 DeepSeek)进行交互。
程序猿的栖息地
2025/08/01
2670
使用 Fetch API 处理AI流式接口,实现在Web开发中前后端的数据交互与显示
面试官:请手写一个带取消功能的延迟函数,axios 取消功能的原理是什么
本文仓库 https://github.com/lxchuan12/delay-analysis.git,求个star^_^[1]
若川
2021/12/22
8160
Node.js v15.x 新特性 — 控制器对象 AbortController
Node.js v15.0.0 提供了一个全局实用 API AbortController,用于在选定的基于 Promise API 中发出取消信号。无需引入在所有模块中均可使用,该 API 的实现是基于浏览器中的 Web API AbortController。
五月君
2021/04/02
1.5K0
Fetch vs Axios
原文链接:https://meticulous.ai/blog/fetch-vs-axios/[1]
chuckQu
2022/08/19
1.6K0
Fetch vs Axios
面试官不要再问我axios了?我能手写简易版的axios
axios作为我们工作中的常用的ajax请求库,作为前端工程师的我们当然是想一探究竟,axios究竟是如何去架构整个框架,中间的拦截器、适配器、 取消请求这些都是我们经常使用的。
@超人
2021/07/29
7170
面试官不要再问我axios了?我能手写简易版的axios
Ajax 之战:XMLHttpRequest 与 Fetch API
Ajax 是大多数 web 应用程序背后的核心技术,它允许页面向 web 服务发出异步请求,因此数据可以不经过页面往返服务器无刷新显示数据。
深度学习与Python
2022/06/13
2.7K0
Ajax 之战:XMLHttpRequest 与 Fetch API
解决前端常见问题:竞态条件
| 导语 竞态条件一词翻译自英语 "race conditions"。当我们在开发前端 web 时,最常见的逻辑就是从后台服务器获取并处理数据然后渲染到浏览器页面上,过程中有不少的细节需要注意,其中一个就是数据竞态条件问题,本文会基于 React 并结合一个小 demo 来解释何为竞态条件,以及循序渐进地介绍解决竞态条件方法。框架不同解决的方式会不一样,但不影响理解竞态条件。 获取数据 下面是一个小 demo:前端获取文章数据,并渲染到页面上 App.tsx import React from 'react
用户1097444
2022/06/29
1.5K0
解决前端常见问题:竞态条件
前端API请求的各种骚操作
API请求的控制一直以来都是前端领域的热点问题,市面上已经有很多优秀的开源项目可供使用。本文本着授人以渔的精神,抛开所有的工具函数,介绍各种场景下如何用最朴素的代码解决实际问题。
Dickensl
2022/06/14
8610
推荐阅读
相关推荐
面试官:如何中断一个网络请求?
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验