异步编程
JavaScript 是单线程语言,异步编程是处理 I/O、计时器与网络请求的核心机制。
事件循环与任务队列
执行栈为空时,事件循环会从任务队列取出任务执行。任务分为宏任务(macrotask,如 setTimeout、I/O)与微任务(microtask,如 Promise.then、queueMicrotask)。每执行一个宏任务后,会清空当前所有微任务。
回调地狱
多层嵌套的回调函数会导致代码可读性差、错误处理困难。Promise 的出现正是为了解决该问题。
Promise 链式调用
Promise 有三种状态:pending、fulfilled、rejected,状态一旦改变不可逆。.then 接收成功与失败回调,.catch 捕获链上错误,.finally 无论结果如何执行。
fetch(url)
.then(r => r.json())
.then(data => render(data))
.catch(err => console.error(err));
async/await
async 函数返回 Promise,await 可暂停执行等待 Promise 结算。错误处理推荐使用 try/catch,代码风格更接近同步写法。
async function load() {
try {
const res = await fetch(url);
return await res.json();
} catch (e) {
return null;
}
}
并发请求
Promise.all 等待全部完成,任一失败立即拒绝;Promise.allSettled 等待全部完成,返回每个 Promise 的状态与结果;Promise.race 取最先结算的;Promise.any 取最先成功的。