首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在外部类对象中访问时,Cancelable Promise会丢失cancel属性

基础概念

Cancelable Promise 是一种特殊的 Promise,它允许你在 Promise 执行过程中取消其操作。通常,Promise 一旦创建并开始执行,就无法被取消,但 Cancelable Promise 提供了这种能力。

相关优势

  1. 资源管理:可以在不需要结果时及时释放资源。
  2. 用户体验:对于长时间运行的任务,用户可以取消操作,提高用户体验。
  3. 错误处理:可以更精细地控制错误处理逻辑。

类型与应用场景

  • 定时任务:如后台数据同步,用户可以在不需要时取消。
  • 网络请求:如文件上传或下载,用户可以在中途取消。
  • 复杂计算:如大数据分析,用户可以在不需要结果时取消。

问题分析

在外部类对象中访问 Cancelable Promise 时丢失 cancel 属性,通常是因为 Promise 对象被重新赋值或者传递过程中丢失了其内部的 cancel 方法。

原因

  1. 重新赋值:外部类可能在某个时刻重新赋值了 Promise 对象,导致原有的 cancel 方法丢失。
  2. 浅拷贝:如果通过浅拷贝传递 Promise 对象,内部的 cancel 方法可能不会被正确复制。

解决方案

方案一:确保 Promise 对象不被重新赋值

代码语言:txt
复制
class ExternalClass {
  constructor() {
    this.cancelablePromise = this.createCancelablePromise();
  }

  createCancelablePromise() {
    let cancel;
    const promise = new Promise((resolve, reject) => {
      // 模拟长时间任务
      setTimeout(() => resolve('Task completed'), 5000);
      cancel = () => reject(new Error('Task canceled'));
    });
    return { promise, cancel };
  }

  runTask() {
    this.cancelablePromise.promise.then(console.log).catch(console.error);
  }

  cancelTask() {
    if (this.cancelablePromise.cancel) {
      this.cancelablePromise.cancel();
    }
  }
}

const external = new ExternalClass();
external.runTask();
// 如果需要取消任务
// external.cancelTask();

方案二:使用深拷贝传递 Promise 对象

代码语言:txt
复制
const deepCopy = (obj) => JSON.parse(JSON.stringify(obj));

class ExternalClass {
  constructor() {
    this.cancelablePromise = this.createCancelablePromise();
  }

  createCancelablePromise() {
    let cancel;
    const promise = new Promise((resolve, reject) => {
      // 模拟长时间任务
      setTimeout(() => resolve('Task completed'), 5000);
      cancel = () => reject(new Error('Task canceled'));
    });
    return { promise, cancel };
  }

  runTask() {
    const copiedPromise = deepCopy(this.cancelablePromise);
    copiedPromise.promise.then(console.log).catch(console.error);
  }

  cancelTask() {
    if (this.cancelablePromise.cancel) {
      this.cancelablePromise.cancel();
    }
  }
}

const external = new ExternalClass();
external.runTask();
// 如果需要取消任务
// external.cancelTask();

注意事项

  • 性能考虑:深拷贝可能会影响性能,特别是对于复杂对象。
  • 兼容性:确保 cancel 方法在所有环境中都能正常工作。

通过上述方法,可以有效避免在外部类对象中访问 Cancelable Promise 时丢失 cancel 属性的问题。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

领券