Skip to content

Series

Executes multiple listeners in sequence.

Basic Usage

ts
import { series } from 'fastevent/executors';
const emitter = new FastEvent()
const messages: FastEventMessage[] = []

// Create 10 listeners
const listeners = Array.from({ length: 10 }).map((_, i) => {
    return (message: FastEventMessage) => {
        messages.push(message)
        return ++i  // Return the sequence number
    }
})
listeners.forEach(listener => {
    emitter.on("test", listener)
})

const results = emitter.emitAsync<number>("test", 1, { 
    executor: series()    
})
expect(results[0]).toBe(10) // Returns the value of the last listener

Configuration Parameters

series supports the following configuration parameters:

ts
export type SeriesExecutorOptions = {
    /**
     * Execute listeners in reverse order
     */
    reverse?: boolean
    /**
     * Control how listeners return results 
     */
    onReturns?: (results: any, cur: any) => any 
    /**
     * Execute before calling the next listener
     */
    onNext?: (index: number, previous: any, 
            message: FastEventMessage, 
            args: FastEventListenerArgs, 
            results: any
    ) => boolean
    /**  
     * 
     * Callback when a listener execution error occurs, return false to abort subsequent execution
     * 
    */
    onError?: 'skip' | 'abort' | 'error' 
            | ((
                e: any, 
                message: FastEventMessage, 
                args: FastEventListenerArgs
            ) => void | 'skip' | 'abort' | 'error')
}

Execute Listeners in Reverse Order

options.reverse defaults to false, meaning listeners are executed in sequence. If set to true, listeners are executed in reverse order.

ts
import { series } from 'fastevent/executors';

const emitter = new FastEvent()
const messages: FastEventMessage[] = []
const listeners = Array.from({ length: 10 }).map((_,i) => {
    return (message: FastEventMessage) => {
        messages.push(message)
        return ++i // Return sequence number
    }
})
listeners.forEach(listener => {
    emitter.on("test", listener)
})
const results = emitter.emit<number>("test", 1, {
    executor: series({
        reverse: true
    })
})
const r = await Promise.all(results)
expect(r.length).toBe(1)
expect(r[0]).toBe(1) // Returns the value of the first listener

Handle Return Results

The onReturns function is called after each listener executes, used to process the listener's return value. onReturns function parameters:

Parameter Type Description
results any The listener's return value, undefined on first call
cur any The current listener's return value

Essentially equivalent to a reduce function.

ts
import { series } from 'fastevent/executors';

const emitter = new FastEvent()
const messages: FastEventMessage[] = []
const listeners = Array.from({ length: 10 }).map((_, i) => {
    return async (message: FastEventMessage) => {
        messages.push(message)
        return ++i // Return sequence number, starting from 1
    }
})
listeners.forEach(listener => {
    emitter.on("test", listener)
})
const results = await emitter.emitAsync<number>("test", 1, {
    executor: series({
        onReturns: (results: number, result: number) => {
            if (results === undefined) results = 0
            return results + result
        }
    })
})
expect(results.length).toBe(1)
// Returns the sum of all listener return values
expect(results[0]).toBe(55)  

Intercept Listener Execution

The onNext function is called before each listener executes, used to intercept listener execution. onNext function parameters:

Parameter Type Description
index number Current listener index
previous any Previous listener's return value
message FastEventMessage Event message
args FastEventListenerArgs Event parameters
results any Listener's return value, undefined on first call

onNext return values:

Return Value Description
true | undefined | void Continue execution
false Interrupt execution, return the most recent listener's return value

Error Handling

The onError function is called when a listener execution error occurs, used to handle errors. onError function parameters:

Parameter Type Description
e any Error object
message FastEventMessage Event message
args FastEventListenerArgs Event parameters

onError function return values:

Return Value Description
skip Skip the current listener, continue executing subsequent listeners
abort Interrupt execution of subsequent listeners, return the most recent listener's return value
error Interrupt execution of subsequent listeners, return the error object (does not trigger an error)
(e, message, args) => void | skip | abort | error Function that returns error response behavior