javascript闭包可封装任务队列实现异步串行执行,支持动态添加、暂停/恢复、错误处理与结果传递,比promise.all(并发)和固定then链更轻量可控。

JavaScript 中可以用闭包封装一个任务队列,让异步操作按顺序执行,效果类似 Promise 链(.then().then()),但更轻量、可控性更强。核心思路是:用闭包保存当前“待执行的下一个函数”,每次 resolve 后自动触发队列中的下一项。
基础版:串行执行 Promise 任务
通过闭包维护一个 next 函数引用,每次任务完成就调用它,形成隐式链:
function createPromiseQueue() {
let next = () => Promise.resolve();
<p>return function push(fn) {
const current = next;
next = () => current().then(() => fn());
return push; // 支持链式调用
};
}</p><p>// 使用示例
const queue = createPromiseQueue();</p><p>queue(() => fetch('/api/a').then(r => r.json()))
(() => new Promise(r => setTimeout(() => { console.log('delayed'); r(); }, 1000)))
(() => Promise.resolve().then(() => console.log('done')));
</p>
增强版:支持返回值传递与错误处理
实际场景中常需把上一个任务的结果传给下一个,也需统一捕获异常。闭包可同时保存状态和错误处理器:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 用闭包变量
acc存上一个 Promise 的 resolved 值 - 用
catchHandler统一处理任意环节的 reject - 每个
push把新函数包裹进.then()和.catch()
function createRobustQueue() {
let chain = Promise.resolve();
let catchHandler = (err) => { console.error('Queue error:', err); };
<p>return {
push(fn) {
chain = chain
.then(fn)
.catch(catchHandler);
return this;
},
catch(fn) {
catchHandler = fn;
return this;
}
};
}</p><p>// 使用
createRobustQueue()
.push(() => Promise.resolve(42))
.push(x => { console.log('got', x); return x * 2; })
.push(x => { throw new Error('oops'); })
.catch(err => alert(err.message));
</p>
实用变体:带暂停/恢复/清空的队列
闭包还能封装更多控制逻辑,比如暂停执行、动态插入、或清空待运行任务:
- 用布尔值
isPaused控制是否跳过执行 - 用数组
pending缓存未启动的任务,恢复时再逐个推入链 -
clear()直接重置闭包内状态
function createControlledQueue() {
let isPaused = false;
let pending = [];
let chain = Promise.resolve();
<p>function runNext() {
if (pending.length === 0 || isPaused) return;
const fn = pending.shift();
chain = chain.then(fn).catch(console.error);
}</p><p>return {
push(fn) {
pending.push(fn);
runNext();
return this;
},
pause() { isPaused = true; return this; },
resume() { isPaused = false; while (pending.length) runNext(); return this; },
clear() { pending = []; return this; }
};
}
</p>
为什么不用原生 Promise.all 或链式 then?
原生 Promise.all 是并发,then 链虽串行但写法固定、不易动态增删。闭包队列的优势在于:
- 任务可运行时动态添加(比如事件触发后追加)
- 执行流完全由你控制(暂停、跳过、重试某一项)
- 不依赖外部变量,状态封闭在闭包内,避免污染作用域
- 适合封装成工具类(如加载器、动画序列、表单提交队列)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










