柯里化本身不改变任务类型,其延迟执行效果取决于最终调用所处的上下文:在 promise.then 中调用属微任务,在 settimeout 中调用属宏任务,直接调用则为同步执行。

函数柯里化本身不直接操作异步队列,但它能天然适配异步任务的「参数预置 + 延迟触发」需求。关键在于:柯里化把执行时机交给最后一次调用,而那次调用完全可以放在微任务或宏任务中完成。
柯里化如何配合 Promise 实现延迟执行
Promise 的 then/catch 是典型的微任务入口。把柯里化函数的最终调用包裹在 Promise.resolve().then() 里,就能让它排队进微任务队列:
- 先用 curry 包装一个需要 3 个参数的异步函数(比如封装 fetch 请求)
- 传入前两个参数(如 URL、method),得到一个等待第三个参数(body)的函数
- 在某个事件或定时器后,拿到 body,再通过 Promise.resolve().then(() => fn(body)) 触发执行
- 此时 fn(body) 就会作为微任务,在当前同步代码结束后立即运行
用 async/await 控制柯里化函数的执行节奏
async 函数内部的 await 会把后续代码挂起,并让出线程。可以把柯里化后的函数调用放在 await 后面,实现可控延迟:
- 定义 const delayedApi = curry(apiRequest)(url)("POST")
- 在 async 函数中写:await new Promise(r => setTimeout(r, 1000)); const res = await delayedApi({data: 1})
- 这样既利用了柯里化的参数分步能力,又通过 Promise 和 await 把最终执行塞进了事件循环的下一轮
柯里化 + 宏任务(如 setTimeout)做真实延迟
如果需要「等几秒再真正发起请求」,直接把柯里化函数的最后一调用丢进 setTimeout:
- const req = curry(fetchWithAuth)(token)(endpoint)
- setTimeout(() => req({body: payload}), 2000)
- 这会让 req({body: payload}) 进入宏任务队列,2 秒后执行,不受微任务抢占影响
- 适合节流、防抖、延迟上报等场景
注意:柯里化函数自身不改变任务类型
柯里化只是函数变形工具,它不会自动把同步函数变异步,也不会把异步函数变同步。它的延迟效果完全取决于你何时、在哪种上下文中调用最终返回的函数:
- 在 click 回调里调用 → 属于宏任务
- 在 Promise.then 里调用 → 属于微任务
- 在 setTimeout 回调里调用 → 新的宏任务
- 直接调用(无任何包装)→ 同步执行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











