我的编程空间,编程开发者的网络收藏夹
学习永远不晚

JS如何为promise增加abort功能

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

JS如何为promise增加abort功能

概述

Promise只有三种状态:pending、resolve、reject,一个异步的承诺一旦发出,经历等待(pending)后,最终只能为成功或者失败,中途无法取消(abort)。

为promise提供abort功能的思路有两种:

  • 手动实现abort,触发取消后,异步回来的数据直接丢弃(手动实现,比较稳妥)
  • 使用原生方法AbortController中断请求(实验中的方法,有兼容性,ie不支持)

手动实现abort方法有两种模式:都是依赖promise的接口间接实现

promise race方法


let PromiseWithAbort = function(promise){
    let _abort = null;
    let Pabort = new Promise((res,rej)=>{
      _abort = function(reason ='abort !'){
        console.warn(reason);
        rej(reason);
      }
    });

    let race = Promise.race([promise,Pabort]);
    race.abort = _abort;
    console.log(promise,Pabort);
    return race;
  }

let p1= new Promise(res=>{
   setTimeout(()=>{
      res('p1 success');
   },2000)
})

let testP = PromiseWithAbort(p1);

testP.then(res=>{
  console.log('success:',res);
},error=>{
  console.log('error:',error);
})

testP.abort();

// 结果: reject: abort!

重新包装promise


class PromiseWithAbort {
    constructor(fn){
      let _abort = null;
      let _p = new Promise((res,rej)=>{
        fn.call(null,res,rej);
        _abort = function(error='abort'){ rej(error); }
      })

      _p.abort = _abort;
      return _p;
    }
  } 


let testP = new PromiseWithAbort((res,rej)=>{
    setTimeout(() => {
      res(1);
    },1000);
  });

 testP.then(r=>{
    console.log('res:',r);
  },r=>{
    console.log('rej:',r);
  });

  testP.abort();
//结果: rej: abort

AbortController 

(这是一个实验中的功能,归属于DOM规范,此功能某些浏览器尚在开发中)AbortController接口代表一个控制器对象,允许你在需要时中止一个或多个DOM请求。


// 中断fetch请求
  let controller = new AbortController();
  let signal = controller.signal;

 fetch('https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/finally',{signal}).then(r=>{
    console.log(r);
  });

  controller.abort();
//结果: Uncaught (in promise) DOMException: The user aborted a request.
//中断一个promise
class PromiseWithAbortController {
  constructor(fn,{signal}){
    if(signal && signal.aborted){
      return Promise.reject(new DOMException('Aborted','AbortError'));
    }

    let _p = new Promise((resolve,reject)=>{
      fn.call(null,resolve,reject);
      if(signal){
        signal.addEventListener('abort',()=>{
          reject(new DOMException('Aborted','AbortError'));
        })
      }
    });

    return _p;
  }
}
let controller = new AbortController();
  let signal = controller.signal;
let testP2 = new PromiseWithAbortController((r,j)=>{
  setTimeout(() => {
    r('success');
  }, 1000);
},{signal});

testP2.then(r=>{
    console.log('res:',r);
  },r=>{
    console.log('rej:',r);
  });

  controller.abort();
  // 结果: rej: DOMException: Aborted

Axios插件自带取消功能


//1.使用source的token
const CancelToken = axios.CancelToken;
const source = CancelToken.source();

axios.get('/user/12345', {
  cancelToken: source.token
}).catch(function (thrown) {
  if (axios.isCancel(thrown)) {
    console.log('Request canceled', thrown.message);
  } else {
    // handle error
  }
});

axios.post('/user/12345', {
  name: 'new name'
}, {
  cancelToken: source.token
})

// cancel the request (the message parameter is optional)
source.cancel('Operation canceled by the user.');

//2. 通过传出的function
const CancelToken = axios.CancelToken;
let cancel;

axios.get('/user/12345', {
  cancelToken: new CancelToken(function executor(c) {
    // An executor function receives a cancel function as a parameter
    cancel = c;
  })
});

// cancel the request
cancel();

//主要:使用相同token的请求可以一并取消

在现在项目中使用最频繁的是axios,所以取消请求不用担心。dom规范的AbortController,由于兼容性,不推荐使用。如果需要自己动手实现的话,还是文章前两种方法较稳妥(promise race方法和重新包装promise方法)。

以上就是JS为promise增加abort功能的详细内容,更多关于JS的资料请关注编程网其它相关文章!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

JS如何为promise增加abort功能

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

CentOS如何增加系统回收站功能

这篇文章将为大家详细讲解有关CentOS如何增加系统回收站功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。linux rm删除文件之后,恢复就比较麻烦了,即使恢复了,文件名格式都变成一串数字了。修改ro
2023-06-10

php购物增加减少功能如何实现

本文小编为大家详细介绍“php购物增加减少功能如何实现”,内容详细,步骤清晰,细节处理妥当,希望这篇“php购物增加减少功能如何实现”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。php实现购物增加减少的方法:1、
2023-07-04

如何为网站添加CNZZ云推荐功能

这篇文章主要讲解了“如何为网站添加CNZZ云推荐功能”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何为网站添加CNZZ云推荐功能”吧!一、首先是注册CNZZ云推荐服务(http://tui
2023-06-10

如何给 Kubernetes Dashboard 增加用户名密码认证功能

本篇内容介绍了“如何给 Kubernetes Dashboard 增加用户名密码认证功能”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!仪表板
2023-06-15

Android通知栏增加快捷开关功能如何实现

本篇内容主要讲解“Android通知栏增加快捷开关功能如何实现”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android通知栏增加快捷开关功能如何实现”吧!TileService继承自Serv
2023-07-05

网站的社交分享功能如何增加用户互动

增加用户互动的社交分享功能包括以下几个方面:提供多种分享渠道:在网站上添加多种社交分享按钮,如微信、微博、Facebook、Twitter等,方便用户选择自己喜欢的分享方式。设计吸引人的分享内容:确保网站上的内容具有吸引力,让用户愿意分享给
网站的社交分享功能如何增加用户互动
2024-04-17

Flutter如何给列表增加下拉刷新和上滑加载更多功能

小编给大家分享一下Flutter如何给列表增加下拉刷新和上滑加载更多功能,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!有状态组件当 Flutter 的页面需要动态
2023-06-15

如何使用MongoDB实现数据的增加、修改、删除功能

如何使用MongoDB实现数据的增加、修改、删除功能MongoDB是一种流行的开源NoSQL数据库,具有高性能、可伸缩性和灵活性。在使用MongoDB存储数据时,我们经常需要对数据进行增加、修改和删除操作。以下是使用MongoDB实现这些功
2023-10-22

jquery如何实现输入框数字的增加和减少功能

本篇内容主要讲解“jquery如何实现输入框数字的增加和减少功能”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“jquery如何实现输入框数字的增加和减少功能”吧!代码实现:首先,需要引入jque
2023-07-05

ASP.NET中如何为服务器控件添加客户端功能

这篇文章主要介绍了ASP.NET中如何为服务器控件添加客户端功能,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。ASP.NET控件开发基础之服务器控件客户端功能1.减轻服务器压
2023-06-18

JS如何实现课程表小程序加入自定义背景功能

这篇文章将为大家详细讲解有关JS如何实现课程表小程序加入自定义背景功能,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。gif演示:在底部会放上gitee的开源地址最近总感觉目前的界面过于简洁了,不满足我这个
2023-06-22

如何为SAP API Portal上创建的API增添API key验证保护功能

如何为SAP API Portal上创建的API增添API key验证保护功能,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。假设我在SAP API Portal上开发了一个
2023-06-04

Win7如何添加远程搜索为资源管理器添加网络搜索的功能

由于工作的需要,python经常要在系统中搜索相应的文件,这自然是在资源管理器完成,不过有时还要从网络上搜索相关的信息,总不可能每时每刻切换到浏览器进行操作吧?其实,我们可以为资源管理器添加网络搜索的功能,下面为大家带来Win7系统添加远程
2023-06-08

编程热搜

目录