Abort Execution
FastEvent
provides a solution to abort the execution of asynchronous listeners by passing an AbortSignal
to all event listeners during emit
.
Basic Usage
ts
import { FastEvent } from "fastevent"
const emitter = new FastEvent<{click: number}>()
emitter.on("click", (message,{abortSignal}) => {
await new Promise((resolve) => {
abortSignal.addEventListener("abort", ()=>{
clearTimeout(tmId)
resolve()
})
doSomething()
resolve()
})
})
// Create an AbortController instance
const abortController = new AbortController()
// Pass AbortController.signal
emitter.emit("click", 1,{
signal: abortController.signal
})
//
abortController.abort()
- Create an
AbortController
instance and pass itsAbortController.signal
when callingemit
. - In the asynchronous listener, use
abortSignal
to listen for theabort
event.
Guide
Passing an Already Aborted Signal
If an already aborted AbortSignal
is passed during emit
, the listener will directly return an AbortError
.
ts
import { FastEvent } from "fastevent"
const emitter = new FastEvent<{click: number}>()
emitter.on("click", (message,{abortSignal}) => {
})
// Create an AbortController instance
const abortController = new AbortController()
abortController.abort()
// Pass AbortController.signal
const results = emitter.emit("click", 1,{
signal: abortController.signal
})
//
console.log(results) // [AbortError]
Handling Abort Signal
In asynchronous listeners, use abortSignal
to listen for the abort
event.
When the abort
event is triggered, the listener can choose to either return normally or throw an AbortError
.
ts
import { FastEvent } from "fastevent"
const emitter = new FastEvent<{click: number}>()
emitter.on("click", (message,{abortSignal}) => {
return new Promise<void>((resolve, reject) => {
abortSignal.addEventListener("abort", ()=>{
clearTimeout(tmId)
reject(new AbortError())
})
doSomething()
resolve()
})
})
// Create an AbortController instance
const abortController = new AbortController()
// Pass AbortController.signal
const results = emitter.emit("click", 1,{
signal: abortController.signal
})
//
console.log(results) // [Promise]
setTimeout(()=>{
abortController.abort()
},3000)