如何取消一个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()