-
Notifications
You must be signed in to change notification settings - Fork 1
/
deferred.ts
46 lines (42 loc) · 989 Bytes
/
deferred.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/**
* A deffered value that can be resolved at a later time outside of its closure.
* @generic T - value of the deffered
*/
export type Deferred<T> = {
resolve: (value: T | PromiseLike<T>) => void
reject: (reason?: any) => void
value: Promise<T>
}
/**
* Create a new Deffered
*
* @generic T - value of the deffered
* @returns Deferred<T>
*/
export const deferred = <T>(): Deferred<T> => {
let resolve!: Deferred<T>['resolve']
let reject!: Deferred<T>['reject']
const value = new Promise<T>((_resolve, _reject) => {
resolve = _resolve
reject = _reject
})
return {
resolve,
reject,
value,
}
}
/**
* Type guard for Deffered values.
*
* @generic T - value of the deffered
* @param value any
* @returns value is Deferred<T>
*/
export const isDeferred = <T>(value: any): value is Deferred<T> =>
typeof value === 'object' &&
value !== null &&
'resolve' in value &&
'reject' in value &&
'value' in value &&
'then' in value.value