首页 > 解决方案 > 扩展 `Promise` 并更改 `then` 签名

问题描述

我想扩展Promise和更改then签名,以便它的回调接收两个值。我尝试了不同的方法,其中两种在此处记录和测试。可悲的是,我收到了各种错误,或者生成的类不像 Promise。

方法 1:包装原生 Promise

export class MyWrappedPromise {
  constructor(data) {
    this.data = data;
    this.promise = new Promise(evaluate.bind(data));
  }

  then(callback) {
    this.promise.then(() => callback(this.data, ADDITIONAL_DATA));
  }

  catch(callback) {
    this.promise.catch(callback);
  }
}

方法 2:扩展原生 Promise

export class MyExtendedPromise extends Promise {
    
  constructor(executor, data) {
    super(executor);
    this.data = data;
  }

  static create(data) {
      return new MyExtendedPromise(evaluate.bind(data), data);
  }

  then(callback) {
    return super.then(() => callback(this.data, ADDITIONAL_DATA));
  }
}

有人对我做错了什么有任何建议吗?随意在 GitHub 上创建 PR。

谢谢

- - - - - - - - - - 编辑 - - - - - - - - - - -

一些附加代码和信息,使上面的代码更容易理解,而无需查看 Github 上的代码和测试。

evaluate只是 Promise 执行器函数。我将其提取出来,以便在我的所有实现和测试中保持一致。它可能看起来很复杂,但它的结构是为了模拟我的“真实”项目。

export function evaluate(resolve, reject) {
  const data = this;
  function getPromise(data) {
    return !!data ? Promise.resolve(data) : Promise.reject(new Error("Error"));
  }

  getPromise(data)
    .then(resolve)
    .catch(reject);
}

ADDITIONAL_DATA只是一个字符串,用于模拟回调中的第二个值。它还被提取以在所有版本和测试中保持一致。

------------------- 编辑 2--------------------

根据解决方案出现的错误

标签: javascriptpromisees6-promise

解决方案


我不太明白为什么你有一个工厂方法,而不是直接使用构造函数。

你的意思是这样的吗?

class MyExtendedPromise extends Promise {

  constructor(executor, data) {
    super(executor);
    this.data = data;
  }

  then(callback, test) {
    console.log('passed new parameter in then:', test);
    console.log('additional data:', this.data);
    return super.then(data => callback(data, test));
  }
}

new MyExtendedPromise((resolve, reject) => {
	setTimeout(() => resolve(true), 2000);
}, 'other additional data').then(data => console.log('my then', data), 'hello world');


推荐阅读