Promises 实现中断

Promises 实现中断

  • Promise 是一种异步解决方案, 但是一旦开启就无法停止, 在一些场景下可能需要用到中断异步任务的功能

实现思路

  1. 封装一个函数, 创建一个新的 Promise 对象
  2. 将其中的 reject 方法保留出来
  3. 接收一个要执行异步任务的 Promise 对象
  4. 利用 race() 方法让两个 Promise 对象赛跑
  5. 将保留的 reject 方法设置到 race() 的结果 Promise 对象上
  6. 将结果 Promise 对象返回
  7. 如果需要手动终止 Promise, 只需要调用返回值的 abort() 方法即可
<template>
  <div>
    <el-button @click="req && req.abort('别想拿结果!')">Click Me</el-button>
  </div>
</template>

<script>
export default {
  name: 'App',

  data () {
    return {
      result: '',
      req: null
    }
  },
  created () {
    const request = new Promise((resolve, reject) => {
      // 模拟服务器请求, 随机 0 ~ 3 秒之间返回数据
      setTimeout(() => {
        resolve('收到服务端数据')
      }, Math.random() * 3000)
    })
    this.req = this.abortWrapper(request)
    this.req.then(res => {
      console.log('成功的结果:', res)
      this.result = res
    }).catch(e => console.log('失败的结果:', e))
  },
  methods: {
    abortWrapper (p1) {
      let abort
      const p2 = new Promise((resolve, reject) => (abort = reject))
      const p = Promise.race([p1, p2])
      p.abort = abort
      return p
    }
  }
}
</script>

总结

  • 灵活运用 race 来变相实现 Promise 的中断
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史蒂文·月

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值