mirror of
https://github.com/harttle/liquidjs.git
synced 2026-09-16 12:50:38 -07:00
pref: remove await/async from internal async calls
This commit is contained in:
@@ -0,0 +1,75 @@
|
||||
import { isFunction } from './underscore'
|
||||
|
||||
type resolver = (x?: any) => Thenable
|
||||
|
||||
interface Thenable {
|
||||
then (resolve: resolver, reject?: resolver): Thenable;
|
||||
catch (reject: resolver): Thenable;
|
||||
}
|
||||
|
||||
function mkResolve (value: any) {
|
||||
const ret = {
|
||||
then: (resolve: resolver) => resolve(value),
|
||||
catch: () => ret
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
function mkReject (err: Error) {
|
||||
const ret = {
|
||||
then: (resolve: resolver, reject?: resolver) => {
|
||||
if (reject) return reject(err)
|
||||
return ret
|
||||
},
|
||||
catch: (reject: resolver) => reject(err)
|
||||
}
|
||||
return ret
|
||||
}
|
||||
|
||||
function isThenable (val: any): val is Thenable {
|
||||
return val && isFunction(val.then)
|
||||
}
|
||||
|
||||
function isCustomIterable (val: any): val is IterableIterator<any> {
|
||||
return val && isFunction(val.next) && isFunction(val.throw) && isFunction(val.return)
|
||||
}
|
||||
|
||||
export function toThenable (val: IterableIterator<any> | Thenable): Thenable {
|
||||
if (isThenable(val)) return val
|
||||
if (isCustomIterable(val)) return reduce()
|
||||
return mkResolve(val)
|
||||
|
||||
function reduce (prev?: any): Thenable {
|
||||
let state
|
||||
try {
|
||||
state = (val as IterableIterator<any>).next(prev)
|
||||
} catch (err) {
|
||||
return mkReject(err)
|
||||
}
|
||||
|
||||
if (state.done) return mkResolve(state.value)
|
||||
return toThenable(state.value!).then(reduce, err => {
|
||||
let state
|
||||
try {
|
||||
state = (val as IterableIterator<any>).throw!(err)
|
||||
} catch (e) {
|
||||
return mkReject(e)
|
||||
}
|
||||
if (state.done) return mkResolve(state.value)
|
||||
return reduce(state.value)
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
export function toValue (val: IterableIterator<any> | Thenable) {
|
||||
let ret: any
|
||||
toThenable(val)
|
||||
.then((x: any) => {
|
||||
ret = x
|
||||
return mkResolve(ret)
|
||||
})
|
||||
.catch((err: Error) => {
|
||||
throw err
|
||||
})
|
||||
return ret
|
||||
}
|
||||
Reference in New Issue
Block a user