代码拉取完成,页面将自动刷新
type QueueItem<T extends unknown[], R> = {
args: T
resolve: (value: R) => void
reject: (reason?: unknown) => void
context: 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 = false
async function processQueue(): Promise<void> {
if (processing) return
if (queue.length === 0) return
processing = true
while (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 processing
if (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()
})
}
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。