如何更好的取消一个promise?

fetch(url, {signal})

.then((response) => {

//do xxx

updateAutocomplete()

})

.catch((error) => {

//do xxx

handleError(error);

})

});

}

怎样实现实现promise的取消?

=================

方案1 - 借助reject 方法


我们都知道一个promise对象状态的改变是通过resolve和reject来执行的。那是不是可以借助reject方法来模拟呢?

上代码

//返回一个promise和abort方法

function getPromise() {

let _res, _rej;

const promise = new Promise((resolve, reject) => {

_res = resolve;

_rej = reject;

setTimeout(() => {

resolve(‘123’)

}, 5000);

});

return {

promise,

abort: () => {

_rej({

name: “abort”,

message: “the promise is aborted”,

aborted: true,

});

}

};

}

const { promise, abort } = getPromise();

promise.then(console.log).catch(e => {

console.log(e);

});

abort();

上面的方法可以正常执行,但是不够通用,可以将Promise构造函数内的逻辑提取出来,作为一个回调传进去。

改造一下

function getPromise(cb) {

let _res, _rej;

const promise = new Promise((res, rej) => {

_res = res;

_rej = rej;

cb && cb(res,rej);

});

return {

promise,

abort: () => {

_rej({

name: “abort”,

message: “the promise is aborted”,

aborted: true,

});

}

};

}

//主逻辑提取出来

function runCb(resolve,reject){

setTimeout(()=>{

resolve(‘1111’)

},3000)

}

const { promise, abort } = getPromise(runCb);

promise.then(console.log).catch(e => {

console.log(e);

});

方案2  - 借助 Promise.race() 方法


相信大家都知道race方法的作用,这里还是简单介绍下。

当有若干个promise, p1, p2, p3…在调用, let p = Promise.race([p1, p2, p3,…])的时候,返回的p也是一个promise。那么p什么时候会被resolve或者被reject呢?

看race我们知道它是竞速或赛跑的意思,所以p1, p2, p3 … 最先一个被resolve或者被reject的结果就是p的resolve或者reject的结果。所以后续的promise的resolve和reject都不会再被执行了。

代码很简单,其实够短小精悍。

//传入一个正在执行的promise

function getPromiseWithAbort§{

let obj = {};

//内部定一个新的promise,用来终止执行

let p1 = new Promise(function(resolve, reject){

obj.abort = reject;

最后

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级Android工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。

因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
阶课程,基本涵盖了95%以上Android开发知识点!不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**

如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值