Skip to content

取消异步任务响应

场景:在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)
        })
        })
    }
    }