跳到主要内容

异步编程

JavaScript 是单线程语言,异步编程是处理 I/O、计时器与网络请求的核心机制。

事件循环与任务队列

执行栈为空时,事件循环会从任务队列取出任务执行。任务分为宏任务(macrotask,如 setTimeoutI/O)与微任务(microtask,如 Promise.thenqueueMicrotask)。每执行一个宏任务后,会清空当前所有微任务。

回调地狱

多层嵌套的回调函数会导致代码可读性差、错误处理困难。Promise 的出现正是为了解决该问题。

Promise 链式调用

Promise 有三种状态:pendingfulfilledrejected,状态一旦改变不可逆。.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 取最先成功的。