如何取消一个Promise
方案一:借助Promise.reject
思路:暴露promise的reject方法,在响应返回前直接reject掉就行了
function createPromiseWithAbort(callback) {
let _reject
let promise = new Promise((resolve, reject) => {
_reject = reject
callback && callback(resolve, reject)
})
return {
promise,
abort() {
_reject('promise aborted')
}
}
}
let { promise, abort } = createPromiseWithAbort((resolve) => {
setTimeout(() => {
resolve(1)
}, 2000)
})
promise.then(res => console.log(res), rej=> console.log(rej))
abort()
方案二:借助Promise.race
思路:先定义一个一直pending状态的p1,和实际的p2进行race,如果想在p2响应结果前中断p2,只需要先响应p1即可(执行p1的reject)
function getPromiseWithAbort(p) {
// 定义一个promise,使它一直处于pending状态
let _reject
let p1 = new Promise((resolve, reject) => {
_reject = reject
})
let promise = Promise.race([p1, p])
return {
promise,
abort(){
_reject('取消执行')
}
}
}
let obj = getPromiseWithAbort(new Promise((resolve,reject) => {
setTimeout(() => {
resolve(1)
}, 2000)
}))
obj.promise.then(res=>console.log(res), rej=>console.log(rej))
obj.abort()