Skip to content

中止执行

FastEvent 提供了中止执行异步监听器的解决方案,可以在emit时传入AbortSignal给所有事件监听器。

基本用法

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()
    })
})

// 创建一个 AbortController 实例
const abortController = new AbortController()

// 传入 AbortController.signal
emitter.emit("click", 1,{
    signal: abortController.signal
})
//
abortController.abort()   
  • 创建一个 AbortController 实例,在emit时传入一个AbortController.signal
  • 在异步监听器中,使用abortSignal来监听abort事件。

指南

传入已经中止的信号

如果在emit时传入一个已经中止的AbortSignal信号,监听器会直接返回AbortError

ts
import { FastEvent } from "fastevent"

const emitter = new FastEvent<{click: number}>()

emitter.on("click",  (message,{abortSignal}) => {
    
})

// 创建一个 AbortController 实例
const abortController = new AbortController()

abortController.abort()   


// 传入 AbortController.signal
const results = emitter.emit("click", 1,{
    signal: abortController.signal
})
//
console.log(results)   // [AbortError]

处理中止信号

在异步监听器中,使用abortSignal来监听abort事件。

abort事件触发时,监听器可以选择正常返回,也可以抛出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()
    })
})

// 创建一个 AbortController 实例
const abortController = new AbortController()

// 传入 AbortController.signal
const results = emitter.emit("click", 1,{
    signal: abortController.signal
})
//
console.log(results)   // [Promise]

setTimeout(()=>{
    abortController.abort()   
},3000)