-
Notifications
You must be signed in to change notification settings - Fork 0
/
latePromise.ts
49 lines (47 loc) · 1.11 KB
/
latePromise.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
47
48
49
/**
* Promise, which can be resolved later using external callbacks returned.
*
* Subsequent calls to rejector and resolver are silently ignored. Only the first call matters.
*
* Do not use it unless you have a good reason. This util comes in really handy when you want to do
* something more tricky like making `.on(...)` received events into awaitable stream of messages,
* which can be processed using `.receive` method.
*/
export const latePromise = <T>(): [
Promise<T>,
(value: T) => void,
(e: any) => void,
] => {
let rejector: null | ((error: any) => void) = null
let resolver: null | ((value: T) => void) = null
let isValueSet = false
let isErrorSet = false
let value: T = null as any
const p = new Promise<T>((resolve, reject) => {
if (isValueSet) {
resolve(value)
} else if (isErrorSet) {
reject(value)
} else {
resolver = resolve
rejector = reject
}
})
return [
p,
v => {
if (resolver != null) resolver(v)
else {
isValueSet = true
value = v
}
},
err => {
if (rejector != null) rejector(err)
else {
isErrorSet = true
value = err
}
},
]
}