Skip to content

async

异步任务队列与共享执行工具。

导入

typescript
import {
  AsyncQueue,
  asyncLimit,
  asyncShared,
  type AsyncQueueOptions,
  type AsyncSharedOptions,
} from '@cloudcome/utils-core/async'

类型定义

AsyncQueueOptions

异步任务队列的配置选项。

typescript
type AsyncQueueOptions = {
  limit?: number
}

属性说明

属性类型默认值描述
limitnumber0并发限制数,0 表示无限制

AsyncSharedOptions<I, O>

异步共享函数的配置选项。

typescript
type AsyncSharedOptions<I extends AnyArray, O> = {
  trailing?: boolean
  maxAge?: number
  onTrigger?: (...inputs: I) => unknown
  onExecute?: (...args: I) => unknown
  onSuccess?: (output: O) => unknown
  onError?: (error: unknown) => unknown
  onFinally?: () => unknown
}

属性说明

属性类型默认值描述
trailingbooleanfalse是否在调用结束后再执行(只在运行期间有再次调用时才会生效)
maxAgenumber-缓存结果的最大有效期(毫秒)
onTrigger(...inputs: I) => unknown-在调用共享函数时触发的回调
onExecute(...args: I) => unknown-在执行异步函数时触发的回调
onSuccess(output: O) => unknown-在异步函数成功执行后触发的回调
onError(error: unknown) => unknown-在异步函数执行失败时触发的回调
onFinally() => unknown-在异步函数执行完成(无论成功或失败)时触发的回调

AsyncQueue<T>

异步任务队列,用于管理和控制异步任务的执行。

typescript
class AsyncQueue<T> {
  constructor(asyncFns: Array<() => Promise<T>>, options?: AsyncQueueOptions)

  get length(): number
  get limit(): number
  get startSettled(): boolean
  get stopSettled(): boolean

  push(afn: () => Promise<T>): Promise<T>
  unshift(afn: () => Promise<T>): Promise<T>
  start(): Promise<T[]>
  stop(): Promise<T[]>
}

构造函数

参数类型描述
asyncFnsArray<() => Promise<T>>要执行的异步函数数组
optionsAsyncQueueOptions可选,队列配置选项

属性

属性类型描述
lengthnumber队列中的任务总数
limitnumber并发限制数
startSettledboolean启动任务是否已全部完成(成功或失败)
stopSettledboolean停止任务是否已全部完成(成功或失败)

方法

方法返回值描述
push(afn)Promise<T>向队列尾部追加任务并执行
unshift(afn)Promise<T>向队列头部插入任务并执行
start()Promise<T[]>启动队列中的任务执行,返回所有启动任务的结果数组
stop()Promise<T[]>终止队列,不再接受新任务,返回所有任务的结果数组

示例

typescript
const tasks = [
  () => promiseDelay(100).then(() => 1),
  () => promiseDelay(200).then(() => 2),
  () => promiseDelay(300).then(() => 3),
]

const queue = new AsyncQueue(tasks, { limit: 2 })

// 动态追加任务
queue.push(() => promiseDelay(100).then(() => 4))

// 启动执行
const results = await queue.start()
console.log(results) // [1, 2, 3, 4]

函数

asyncLimit

使用给定的并发限制执行异步函数。

typescript
function asyncLimit<T>(asyncFns: Array<() => Promise<T>>, limit: number): Promise<T[]>

参数

参数类型描述
asyncFnsArray<() => Promise<T>>异步函数数组
limitnumber并发限制数量,0 表示不限制

返回值

Promise<T[]> - 所有异步函数执行完毕后的结果数组

示例

typescript
const tasks = [
  () => fetch('/api/1').then(r => r.json()),
  () => fetch('/api/2').then(r => r.json()),
  () => fetch('/api/3').then(r => r.json()),
]

// 最多同时执行 2 个请求
const results = await asyncLimit(tasks, 2)

asyncShared

创建一个共享执行结果的异步函数,避免重复请求。

typescript
function asyncShared<I extends AnyArray, O>(
  af: (...inputs: I) => Promise<O>,
  options?: AsyncSharedOptions<I, O>
): (...inputs: I) => Promise<O>

参数

参数类型描述
af(...inputs: I) => Promise<O>要共享的异步函数
optionsAsyncSharedOptions<I, O>可选,配置选项

返回值

(...inputs: I) => Promise<O> - 共享执行结果的异步函数

示例

typescript
const fetchData = async (id: number) => {
  return fetch(`/api/data/${id}`).then(r => r.json())
}

const sharedFetch = asyncShared(fetchData, { maxAge: 1000 })

// 多次调用会共享同一个请求
const [result1, result2] = await Promise.all([
  sharedFetch(1),
  sharedFetch(1),
])
// 只发起了一次请求,result1 和 result2 相同

基于 MIT 许可发布