- promise一旦创建,就不能取消,
- 状态变化只有两种形式,由pending状态变为resolve状态或由pending状态变为reject状态
- 取消Promise,实际上也是调用Pormise的reject方法,将Promise的状态转为失败状态,从而间接做到取消Promise的效果
模拟取消ajax请求
function createAjax() {
let outerTime = setTimeout(() => {
console.log("输出内容")
outerTime = null
}, 2000)
return {
outerTime,
abort() {
if (outerTime) {
console.log("取消请求")
clearTimeout(outerTime)
}
}
}
}
function execute(obj) {
const ajax = createAjax()
if (obj.cancelConfig) {
obj.cancelConfig.then(() => {
ajax.abort()
})
}
}
function createPromise() {
let _resolve = null
const p = new Promise((resolve) => {
_resolve = resolve
})
return {
resolve: _resolve,
p
}
}
const p1 = createPromise()
execute({ cancelConfig: p1.p })
setTimeout(() => {
p1.resolve()
}, 3000)
模拟取消promise请求
function createPromise() {
let _reject;
const promise = new Promise((resolve, reject) => {
_reject = reject
setTimeout(() => {
resolve("promise执行成功")
}, 2000)
})
return {
promise,
abort() {
_reject("取消Promise请求")
}
}
}
const p = createPromise()
p.promise.then(res => {
console.log(res)
}).catch(err => {
console.log(err)
})
p.abort()
利用promise.race模拟间接取消promise请求
const p1 = new Promise((resolve) => {
setTimeout(() => {
resolve("执行成功")
}, 2000)
})
function createPromise() {
let _reject
const promise = new Promise((_, reject) => {
_reject = reject
})
return {
promise,
abort() {
_reject("取消请求")
}
}
}
const pObj = createPromise()
const p3 = Promise.race([p1, pObj.promise])
p3.then(res => {
console.log(res)
}).catch(err=>{
console.log(err)
})
pObj.abort()