// Promises are put into their own facade file so that they can be used without // introducing a dependency on rxjs. They are re-exported through facade/async. export {Promise}; export interface PromiseCompleter { promise: Promise; resolve: (value?: R | PromiseLike) => void; reject: (error?: any, stackTrace?: string) => void; } export class PromiseWrapper { static resolve(obj: T): Promise { return Promise.resolve(obj); } static reject(obj: any, _): Promise { 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(promise: Promise, onError: (error: any) => T | PromiseLike): Promise { return promise.catch(onError); } static all(promises: any[]): Promise { if (promises.length == 0) return Promise.resolve([]); return Promise.all(promises); } static then(promise: Promise, success: (value: T) => U | PromiseLike, rejection?: (error: any, stack?: any) => U | PromiseLike): Promise { return promise.then(success, rejection); } static wrap(computation: () => T): Promise { 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 { var resolve; var reject; var p = new Promise(function(res, rej) { resolve = res; reject = rej; }); return {promise: p, resolve: resolve, reject: reject}; } }