asynchronoustypescriptdart

TypeScript equivalent to Dart `Completer`


In Dart I have a Completer that returns a Future (Promise) and that Future can be completed somewhere else then where it was created, like

class SomeClass {
  final Completer<bool> initializationDone = new Completer<bool>();

  SomeClass() {
    _doSomeAsyncInitialization();
  }

  void _doSomeAsyncInitialization() {
    // some async initialization like a HTTP request
    fetchDataFromServer().then((data) {
      processData();
      initializationDone.complete(true);
    });
  }
}

main() {
  var some = new SomeClass();
  some.initializationDone.future.then((success) {
    // do something.
  });
}

I don't want a solution for this actual problem, this is only an example I came up with to demonstrate how a Completer is used in Dart. What would be an equivalent to the Dart Completer in TypeScript?


Solution

  • This looks like an implementation of such a Completer in TypeScript https://github.com/angular/angular/blob/b0009f03d510370d9782cf76197f95bb40d16c6a/modules/angular2/src/facade/promise.ts

    export {Promise};
    
    export interface PromiseCompleter<R> {
      promise: Promise<R>;
      resolve: (value?: R | PromiseLike<R>) => void;
      reject: (error?: any, stackTrace?: string) => void;
    }
    
    export class PromiseWrapper {
      static resolve<T>(obj: T): Promise<T> { return Promise.resolve(obj); }
    
      static reject(obj: any, _): Promise<any> { return Promise.reject(obj); }
    
      // Note: We can't rename this method into `catch`, as this is not a valid
      // method name in Dart.
      static catchError<T>(promise: Promise<T>,
                           onError: (error: any) => T | PromiseLike<T>): Promise<T> {
        return promise.catch(onError);
      }
    
      static all(promises: any[]): Promise<any> {
        if (promises.length == 0) return Promise.resolve([]);
        return Promise.all(promises);
      }
    
      static then<T, U>(promise: Promise<T>, success: (value: T) => U | PromiseLike<U>,
                        rejection?: (error: any, stack?: any) => U | PromiseLike<U>): Promise<U> {
        return promise.then(success, rejection);
      }
    
      static wrap<T>(computation: () => T): Promise<T> {
        return new Promise((res, rej) => {
          try {
            res(computation());
          } catch (e) {
            rej(e);
          }
        });
      }
    
      static scheduleMicrotask(computation: () => any): void {
        PromiseWrapper.then(PromiseWrapper.resolve(null), computation, (_) => {});
      }
    
      static isPromise(obj: any): boolean { return obj instanceof Promise; }
    
      static completer(): PromiseCompleter<any> {
        var resolve;
        var reject;
    
        var p = new Promise(function(res, rej) {
          resolve = res;
          reject = rej;
        });
    
        return {promise: p, resolve: resolve, reject: reject};
      }
    }