| 5 | * Use with care! |
| 6 | */ |
| 7 | export function createPromiseWithResolver<T>(): [Promise<T>, (result: T) => void] { |
| 8 | let alreadyResolved = false |
| 9 | let resolvedTo: T |
| 10 | let resolver: (value: T | PromiseLike<T>) => void = doNothing |
| 11 | |
| 12 | const promise = new Promise<T>(resolve => { |
| 13 | if (alreadyResolved) { |
| 14 | resolve(resolvedTo) |
| 15 | } else { |
| 16 | resolver = resolve |
| 17 | } |
| 18 | }) |
| 19 | const exposedResolver = (value: T) => { |
| 20 | alreadyResolved = true |
| 21 | resolvedTo = value |
| 22 | resolver(resolvedTo) |
| 23 | } |
| 24 | return [promise, exposedResolver] |
| 25 | } |