【问题标题】:Javascript Promise - spread and add other methodsJavascript Promise - 传播和添加其他方法
【发布时间】:2020-12-12 03:46:31
【问题描述】:

可以做如下功能吗?

const method = () => {
    let _reject;
    const promise = new Promise((resolve, reject) => {
      _reject = reject;
      ...
    });
  
    return {
      ...promise,
      cancel: () => _reject('cancelled'),
    }
}

即我可以这样做:

const promise = method();
// now I have promise.then, promise.catch and promise.cancel

这只是一个例子;我希望能够为这个“承诺”对象添加额外的属性。

【问题讨论】:

  • 请记住,这个假设的 cancel() 方法实际上并没有终止由 Promise 构造函数发起的异步代码。

标签: javascript node.js


【解决方案1】:

不,你不能传播一个 Promise 实例,因为它会丢失它的原型(方法),但你可以像添加任何对象一样简单地向它添加属性:

promise.cancel = () => _reject('cancelled');
return promise;

(请注意,我并不是说这是个好主意)

【讨论】:

    【解决方案2】:

    看到这个答案Extending a Promise in javascript

    你可能需要扩展你的专业 Promise 类

    class CancellablePromise extends Promise {
       cancel(){ }
    }
    

    【讨论】:

      【解决方案3】:

      您可以执行以下操作:

      const _resolve= Symbol('resolve');
      const _reject= Symbol('reject');
      
      class ExPromise extends Promise{
          constructor(executor) {
              let resolve, reject;
      
              super((_resolve, _reject) => {
                  resolve = _resolve;
                  reject = _reject;
                  executor(resolve, reject);
              });
      
              this[_resolve]= resolve;
              this[_reject]= reject;
          }
      
          cancel(){
              this[_reject](new Error('canceled'));
          }
      }
      

      如果您需要取消嵌套的 Promise 或其他一些额外功能,您可以尝试 c-promise2

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-01-04
        • 1970-01-01
        • 2014-04-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-06-25
        • 1970-01-01
        相关资源
        最近更新 更多