type QueueItem<T extends unknown[], R> = {args: Tresolve: (value: R) => voidreject: (reason?: unknown) => voidcontext: unknown}/*** Creates a sequential execution wrapper for async functions to prevent race conditions.* Ensures that concurrent calls to the wrapped function are executed one at a time* in the order they were received, while preserving the correct return values.** This is useful for operations that must be performed sequentially, such as* file writes or database updates that could cause conflicts if executed concurrently.** @param fn - The async function to wrap with sequential execution* @returns A wrapped version of the function that executes calls sequentially*/export function sequential<T extends unknown[], R>(fn: (...args: T) => Promise<R>,): (...args: T) => Promise<R> {const queue: QueueItem<T, R>[] = []let processing = falseasync function processQueue(): Promise<void> {if (processing) returnif (queue.length === 0) returnprocessing = truewhile (queue.length > 0) {const { args, resolve, reject, context } = queue.shift()!try {const result = await fn.apply(context, args)resolve(result)} catch (error) {reject(error)}}processing = false// Check if new items were added while we were processingif (queue.length > 0) {void processQueue()}}return function (this: unknown, ...args: T): Promise<R> {return new Promise((resolve, reject) => {queue.push({ args, resolve, reject, context: this })void processQueue()})}}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。