Skip to content

Instantly share code, notes, and snippets.

@slikts
Last active April 6, 2017 20:34
Show Gist options
  • Save slikts/0163a722c3a5284a55c72d2d91cd6905 to your computer and use it in GitHub Desktop.
Save slikts/0163a722c3a5284a55c72d2d91cd6905 to your computer and use it in GitHub Desktop.
A promise whose results can be discarded; a quick and dirty substitute for canceling Fetch API
class SilenceablePromise<T> extends Promise<T> {
silence: () => void
constructor(
executor: (
resolve: (value?: T | PromiseLike<T>) => void,
reject: (reason?: any) => void,
) => void,
) {
let silence: any
super((resolve, reject) => {
let silenced = false
silence = () => { silenced = true }
const wrap = (fn: typeof resolve) => (value: any) => { if (!silenced) fn(value) }
executor(wrap(resolve), wrap(reject))
})
this.silence = silence
}
}
const p = new SilenceablePromise((resolve) => {
window.setTimeout(resolve, 200)
})
p.then(console.log, console.error)
p.silence()
const silenceableFetch = (input: RequestInfo, init?: RequestInit) =>
new SilenceablePromise((resolve, reject) => fetch(input, init).then(resolve, reject))
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment