取消异步任务响应
场景:在tabs切换请求数据时,可能因为网络延迟,上一次请求数据返回的时间晚于下一次请求数据的时间,导致页面渲染了上一次请求的数据而不是最新的数据。
解决方案
取消上一次异步请求,不使用上一次返回的数据
js
// 阻止请求多次执行
const NOOP = () => {}
export const createCancelTask = (asyncTask) => {
let cancel = NOOP
return (...parms) => {
return new Promise((resolve, reject) => {
cancel() // 取消上一次的请求
cancel = () => {
// 把resolve和reject置为空,阻止上一次任务执行,使其出去pending状态
resolve = NOOP
reject = NOOP
}
// 状态穿透
asyncTask(...parms).then((res) => {
resolve(res)
}).catch((err) => {
reject(err)
})
})
}
}