1 Star 0 Fork 0

up/claude-code-source-code

加入 Gitee
与超过 1400万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
sequential.ts 1.60 KB
一键复制 编辑 原始数据 按行查看 历史
sanbucat 提交于 2026-03-31 17:08 +08:00 . v2.1.88 反编译源码
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()
})
}
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/up/claude-code-source-code.git
git@gitee.com:up/claude-code-source-code.git
up
claude-code-source-code
claude-code-source-code
main

搜索帮助