Something went wrong. Try again.
Monorepo for Aesthetic.Computer aesthetic.computer
Something went wrong. Try again.
1.6 kB · 56 lines
TypeScript
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556import { Disposable, Event, EventEmitter } from "vscode";
export interface PromiseAdapter<T, U> { ( value: T, resolve: (value: U | PromiseLike<U>) => void, reject: (reason: any) => void ): any;}
const passthrough = (value: any, resolve: (value?: any) => void) => resolve(value);
/** * Return a promise that resolves with the next emitted event, or with some future * event as decided by an adapter. * * If specified, the adapter is a function that will be called with * `(event, resolve, reject)`. It will be called once per event until it resolves or * rejects. * * The default adapter is the passthrough function `(value, resolve) => resolve(value)`. * * @param event the event * @param adapter controls resolution of the returned promise * @returns a promise that resolves or rejects as specified by the adapter */ export function promiseFromEvent<T, U>(event: Event<T>, adapter: PromiseAdapter<T, U> = passthrough): { promise: Promise<U>; cancel: EventEmitter<void> } { let subscription: Disposable; let cancel = new EventEmitter<void>(); return { promise: new Promise<U>((resolve, reject) => { cancel.event(_ => reject('Cancelled')); subscription = event((value: T) => { try { Promise.resolve(adapter(value, resolve, reject)) .catch(reject); } catch (error) { reject(error); } }); }).then( (result: U) => { subscription.dispose(); return result; }, error => { subscription.dispose(); throw error; } ), cancel };}