代码之家  ›  专栏  ›  技术社区  ›  Dominykas Mostauskis

延期延长承诺

  •  4
  • Dominykas Mostauskis  · 技术社区  · 7 年前

    以下实施

    export class Deferred<T> extends Promise<T> {                                   
      public _resolveSelf;
      public _rejectSelf;                                                           
      constructor() {
        super(
          (resolve, reject) =>
          {
            this._resolveSelf = resolve
            this._rejectSelf = reject
          }
        )
      }                                                                             
      public resolve(val:T) { this._resolveSelf(val) }
      public reject(reason:any) { this._rejectSelf(reason) }                        
    }
    

    投掷 TypeError: _this is undefined

    this Typescript playground ,可以看出编译后的javascript很有趣。在第15行中,在声明 _this 其属性已被指定。

    2 回复  |  直到 7 年前
        1
  •  5
  •   Michael Fry    2 年前
    export class Deferred<T> implements Promise<T> {
    
      private _resolveSelf;
      private _rejectSelf;
      private promise: Promise<T>
    
      constructor() {
        this.promise = new Promise( (resolve, reject) =>
          {
            this._resolveSelf = resolve
            this._rejectSelf = reject
    
          }
        )
      }
    
      public then<TResult1 = T, TResult2 = never>(
        onfulfilled?: ((value: T) =>
          TResult1 | PromiseLike<TResult1>) | undefined | null,
        onrejected?: ((reason: any) =>
          TResult2 | PromiseLike<TResult2>) | undefined | null
        ): Promise<TResult1 | TResult2> {
          return this.promise.then(onfulfilled, onrejected)
        }
    
      public catch<TResult = never>(
        onrejected?: ((reason: any) =>
          TResult | PromiseLike<TResult>) | undefined | null
        ): Promise<T | TResult> {
          return this.promise.catch(onrejected)
        }
    
      public resolve(val:T) { this._resolveSelf(val) }
      public reject(reason:any) { this._rejectSelf(reason) }
    
      [Symbol.toStringTag]: 'Promise'
    
    }
    

    then catch 复制粘贴自 Typescript's Promise interface [Symbol.toStringTag] 行也是Typescript认为这是一个承诺所必需的,尽管您只能在编译时发现这一点。

        2
  •  4
  •   Bergi    7 年前

    如何实现延期承诺以延长承诺?

    no good reason to use deferreds .

    即使在那时,一个延迟的 是一个

    function defer() {
        var deferred = {};
        deferred.promise = new Promise(resolve => {
            deferred.resolve = resolve;
        });
        return deferred;
    }
    

    可以看出编译后的javascript很有趣。在第15行中,在_声明期间,已经分配了其属性。

    是的,就是这样 super 作品:你不能使用 this

    你必须写信

    export class Deferred<T> extends Promise<T> {
      public resolve: T=>void;
      public reject: any=>void;
      constructor() {
        var resolveSelf, rejectSelf
        super((resolve, reject) => {
          resolveSelf = resolve
          _rejectSelf = reject
        })
        this.resolve = resolveSelf;
        this.reject = rejectSelf;
      }
    }