Press n or j to go to the next uncovered block, b, p or k for the previous block.
| 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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | 2x 2x 2x 2x 2x 3x 3x 3x 2x 2x 3x 3x 2x 1x 1x 1x 1x 2x 5x 1x 4x 1x 3x 3x 3x 3x 3x 2x | export interface SignalResult<T> {
set(value: T): void
throw(error: any): void
get(): Promise<T>
}
/**
* 信号。
*/
export function signal<T>(): SignalResult<T> {
let value!: T
let isOk = false
let error!: any
let isFail = false
const $resolve: any[] = []
const $reject: any[] = []
const setValue: SignalResult<T>['set'] = _value => {
value = _value
if ($resolve.length) {
$resolve.forEach(resolve => resolve(value))
$resolve.length = 0
$reject.length = 0
}
isOk = true
isFail = false
}
const throwError: SignalResult<T>['throw'] = _error => {
error = _error
Iif ($reject.length) {
$reject.forEach(reject => reject(error))
$resolve.length = 0
$reject.length = 0
}
isOk = false
isFail = true
}
const getValue: SignalResult<T>['get'] = () => {
if (isOk) {
return Promise.resolve<T>(value)
}
if (isFail) {
return Promise.reject(error)
}
return new Promise<T>((resolve, reject) => {
Iif (isOk) {
return resolve(value)
}
Iif (isFail) {
return reject(error)
}
$resolve.push(resolve)
$reject.push(reject)
})
}
return {
set: setValue,
get: getValue,
throw: throwError,
}
}
|