Timeout for Deno
Create (abortable) promises that resolve/reject when the delay is exceeded.
Very useful for racing strategies using Promise.race or Abort.race.
Install
$ deno cache https://deno.land/x/timeout/mod.ts
Usage with await
import { Timeout, TimeoutError } from "https://deno.land/x/timeout/mod.ts"
const timeout = Timeout.wait(1000)
try {
timeout.abort() // Comment me
await timeout
} catch(e){
if(e instanceof AbortSignal)
// Aborted
}
Usage with callbacks
import { Timeout, TimeoutError } from "https://deno.land/x/timeout/mod.ts"
// Will resolve when timed out
Timeout.wait(1000)
.then(() => console.log("That was long!"))
.catch(() => console.error("Aborted"))
// Will reject with TimeoutError when timed out
Timeout.error(2000)
.catch((e) => console.error("Timed out or aborted"))
.abort() // Comment me
Usage with racing Promises
You can use Timeout.race to race some Promises with a timeout.
Promises are ignored if the delay is exceeded.
import { Timeout, TimeoutError } from "https://deno.land/x/timeout/mod.ts"
try{
const req1 = fetch("...")
const req2 = fetch("...")
// Requests are ignored if the delay is exceeded
const res = await Timeout.race([req1, req2], 1000)
const json = await res.json()
} catch(e){
if(e instanceof TimeoutError)
// Timed out
}
Usage with racing Abortables
You can use Timeout.race to race some Abortables with a timeout.
Abortables are aborted if the delay is exceeded.
import { Abort, Abortable } from "https://deno.land/x/abortable/mod.ts"
import { Timeout, TimeoutError } from "https://deno.land/x/timeout/mod.ts"
try{
const req = Abort.fetch("...")
const req2 = Abort.fetch("...")
// Both requests are aborted if the delay is exceeded
const res = await Timeout.race([req1, req2], 1000)
const json = await res.json()
} catch(e){
if(e instanceof TimeoutError)
// Timed out
}
Test
Run test.ts with the given timeout delay (in milliseconds)
$ deno run test.ts 1000
OK
$ deno run test.ts 100
Timeout