Skip to content

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 its AbortController.signal when calling emit.
  • In the asynchronous listener, use abortSignal to listen for the abort 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)