一、Promise鏈?zhǔn)絻?yōu)化
通過減少不必要的await,改用Promise鏈?zhǔn)秸{(diào)用可顯著降低上下文切換開銷。典型場(chǎng)景是多個(gè)有依賴關(guān)系的異步操作:
fetch('/api/data')
.then(response => response.json())
.then(data => processData(data))
.then(result => saveResult(result))
.catch(error => console.error(error));
相比async/await寫法,這種鏈?zhǔn)秸{(diào)用避免了多次微任務(wù)隊(duì)列調(diào)度,高頻調(diào)用時(shí)性能提升可達(dá)30%
二、并行執(zhí)行方案
const [userData, productList, promotions] = await Promise.all([
fetchUser(),
fetchProducts(),
fetchPromotions()
]);
優(yōu)化后執(zhí)行時(shí)間從各操作總和縮減為最慢操作的時(shí)間,實(shí)測(cè)性能提升40-60%
三、批處理技術(shù)
處理大量獨(dú)立異步任務(wù)時(shí),批處理比循環(huán)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池化技術(shù)
1.通過Set追蹤運(yùn)行中的任務(wù),隊(duì)列管理待執(zhí)行任務(wù)
2.動(dòng)態(tài)控制并發(fā)數(shù)量,避免資源耗盡
3.相比傳統(tǒng)await循環(huán),實(shí)測(cè)性能提升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}`));
}
五、事件循環(huán)優(yōu)化技巧
1.微任務(wù)優(yōu)先:使用Promise.resolve()將同步任務(wù)轉(zhuǎn)為微任務(wù)
function urgentTask() {
Promise.resolve().then(() => {
// 高優(yōu)先級(jí)任務(wù)
});
}
2.任務(wù)分片:將長(zhǎng)任務(wù)分解為多個(gè)微任務(wù)
async function chunkedWork(items) {
for (const item of items) {
await Promise.resolve().then(() => process(item));
}
}