一、Promise链式优化
通过减少不必要的await,改用Promise链式调用可显著降低上下文切换开销。典型场景是多个有依赖关系的异步操作:
fetch('/api/data')
.then(response => response.json())
.then(data => processData(data))
.then(result => saveResult(result))
.catch(error => console.error(error));
相比async/await写法,这种链式调用避免了多次微任务队列调度,高频调用时性能提升可达30%
二、并行执行方案
const [userData, productList, promotions] = await Promise.all([
fetchUser(),
fetchProducts(),
fetchPromotions()
]);
优化后执行时间从各操作总和缩减为最慢操作的时间,实测性能提升40-60%
三、批处理技术
处理大量独立异步任务时,批处理比循环await更高效:
const batchProcess = async (items, batchSize) => {
for (let i = 0; i < items.length; i += batchSize) {
const batch = items.slice(i, i + batchSize);
await Promise.all(batch.map(processItem));
}
};
四、Promise池化技术
1.通过Set追踪运行中的任务,队列管理待执行任务
2.动态控制并发数量,避免资源耗尽
3.相比传统await循环,实测性能提升80%
class PromisePool {
constructor(concurrency) {
this.concurrency = concurrency;
this.running = new Set();
this.queue = [];
}
add(task) {
return new Promise((resolve) => {
this.queue.push(() => {
const promise = task()
.finally(() => {
this.running.delete(promise);
resolve();
this.startNext();
});
this.running.add(promise);
this.startNext();
});
});
}
startNext() {
while (this.running.size < this.concurrency && this.queue.length) {
const task = this.queue.shift();
task();
}
}
}
// 使用示例
const pool = new PromisePool(5);
for (let i = 0; i < 100; i++) {
pool.add(() => fetch(`/api/item/${i}`));
}
五、事件循环优化技巧
1.微任务优先:使用Promise.resolve()将同步任务转为微任务
function urgentTask() {
Promise.resolve().then(() => {
// 高优先级任务
});
}
2.任务分片:将长任务分解为多个微任务
async function chunkedWork(items) {
for (const item of items) {
await Promise.resolve().then(() => process(item));
}
}