jessquery
Version:
Modern JavaScript is pretty good, but typing document.querySelector() is a pain. This is a tiny library that makes DOM manipulation easy. jQuery is around 80kb (30kb gzipped), while this is only around 8kb (3.5kb gzipped). Lots of JSDoc comments so it's s
48 lines (39 loc) • 1.06 kB
JavaScript
import { errorHandler } from "./errors.js"
export function promisify(fn, meta = {}) {
const { timeout = 5000, interval } = meta
return (...args) =>
new Promise((resolve, reject) => {
let settled = false
let intervalId
const cleanUp = () => intervalId && clearInterval(intervalId)
const Resolve = (value) => {
if (!settled) {
settled = true
cleanUp()
resolve(value)
}
}
const Reject = (reason) => {
if (!settled) {
settled = true
cleanUp()
meta.error = reason
reject(meta)
}
}
const run = () => {
try {
fn(Resolve, Reject, ...args)
} catch (e) {
cleanUp()
errorHandler(e, meta)
}
}
interval ? (intervalId = setInterval(run, interval)) : run()
setTimeout(() => {
if (!settled) {
Reject(`Timeout: ${timeout}ms exceeded`)
}
}, timeout)
})
}