美文网首页
Promise 异步分离实现 cancel request

Promise 异步分离实现 cancel request

作者: 在幽幽暗暗反反复复中追问 | 来源:发表于2020-05-07 11:21 被阅读0次

巧妙的通过改变 Promise 状态实现取消请求

封装之后外部拿不到 xhr 实例,内部通过判断传入的 cancelToken.promise 的状态达到取消请求的效果

// class CannelToken
class CannelToken {
  promise
  reason

  constructor(executor) {
    let resolvePromise
    this.promise = new Promise(resolve => {
      // 将 resolve 函数保存,需要将 promise 状态改为 resolved 的时候再调用
      resolvePromise = resolve
    })
    // 执行实例化时传入的函数,(message) => { // ... } 作为参数
    // 将 resolvePromise 暴露
    executor(message => {
      if (this.reason) {
        return
      }
      this.reason = message
      resolvePromise(this.reason)
    })
  }
}
// xhr.ts
// 请求配置 config 中可能有 cancelToken 属性 
// config.cancelToken 是类 CancelToken 的实例,保存了 promise
if (config.cancelToken) {
  // 当 promise 从 pending 状态变为 fulfilled 就会执行以下代码
  config.cancelToken.promise.then(res => {
    request.abort()
    reject(res)
  })
}
request.sent()
// demo 发请求
let cancel
axios.get('cancel/get', {
  cancelToken: new CancelToken(function (c) {
    // 参数 c 就是 (message) => { // ... }
    cancel = c
  })
})

// 调用 cancel 就可以调用 resolvePromise,从而改变 promise 的状态
// 然后执行 xhr.ts 中的 promise.then
cancel()

相关文章

网友评论

      本文标题:Promise 异步分离实现 cancel request

      本文链接:https://www.haomeiwen.com/subject/szfwghtx.html