🧠 1. 同步 vs 异步:CPU 的“多线程”幻想
☕️ 煮咖啡 vs 等外卖
- 同步就像煮咖啡:你必须等咖啡机咕噜咕噜做完才能喝。代码必须按顺序执行,比如同步的
console.log和for循环。 - 异步就像点外卖:你点完单后继续刷手机(执行后续代码),外卖小哥送餐时再通知你(执行回调)。
🧪 1.html 实验现场
<script>
setTimeout(() => {
console.log('222'); // 🤯 异步任务会先跳过这里!
}, 10);
console.log('1111'); // 🔥 先执行同步代码
for(let i = 0; i < 100; i++){
console.log('2222'); // 💡 同步代码阻塞后续
}
</script>
输出顺序揭秘:
1111(同步代码立即执行)- 100个
2222(同步循环阻塞主线程) 222(异步任务最后执行)
👉 异步代码不会阻塞同步代码,但同步代码会“霸占”CPU时间片!
🎯 2. Promise 是什么?“画饼”的艺术!
🎭 画饼三连击
new Promise(fn):画个饼(创建Promise)resolve():兑现承诺(异步任务完成).then():吃饼(处理结果)
🧪 2.html 神奇画饼术
<script>
const p = new Promise((resolve, reject) => {
console.log('333'); // 🧨 构造函数立即执行!
setTimeout(() => {
console.log('222'); // 🕒 异步任务完成后才调用 resolve
resolve(); // ✅ 打开吃饼通道
}, 10);
});
p.then(() => {
console.log('1111'); // 🍞 终于吃到饼啦!
});
</script>
执行顺序:
333(构造函数同步执行)- 打印Promise对象(状态为pending)
222(10ms后异步任务完成)1111(then回调被触发)
💡 Promise 把异步流程变成同步式写法,告别回调地狱!
🔁 3. 从 .then() 到 async/await:异步控制的“进化论”
🌬️ 从手摇扇到空调
.then()是“手摇风扇”:代码嵌套深,容易头晕async/await是“空调”:异步代码像同步代码一样优雅
🧪 3.html GitHub API 案例
<script>
document.addEventListener('DOMContentLoaded', async () => {
try {
const res = await fetch('https://api.github.com/users/WildBlue58/repos'); // 🧊 等待空调吹凉
const data = await res.json(); // 🧊 再等数据解析完成
console.log(data); // ✅ 数据终于到手
} catch (error) {
console.error('获取数据失败:', error); // 🛑 错误捕获更简单
}
});
</script>
对比传统 .then() 写法:
// 注释掉的地狱代码
fetch(...)
.then(res => res.json())
.then(data => { /* ... */ })
.catch(err => console.error(err));
🔥 async/await 让异步代码可读性提升9000%!
🛠️ 4. 实战演练:调试异步代码的“三板斧”
🔍 4.html IIFE 与 await 大法
<script>
(async () => { // 🧪 立即执行函数
const p = new Promise(resolve => {
setTimeout(() => {
console.log('异步完成'); // 🕒 异步任务
resolve();
}, 1000);
});
console.log('开始等待...'); // 🚨 异步代码会跳过这里
await p; // ⏸️ 暂停函数执行,等待Promise完成
console.log('继续执行'); // ✅ 等待结束后继续
})();
</script>
调试小贴士:
console.log插眼法:在关键位置加日志追踪执行顺序- 断点调试:Chrome DevTools 中设置断点,观察Promise状态变化
- 时间轴分析:Performance 面板查看异步任务耗时
🧩 5. 立即执行函数 + async/await:异步世界的“魔法咒语”
🧙♂️ IIFE 的奇妙用法
- 立即执行函数(IIFE)就像施法后立刻生效的魔法咒语
- async/await 则是让异步代码拥有“暂停时间”的能力
🧪 4.html 异步魔法实战
<script>
// ===== 立即执行函数和异步操作示例 =====
// 使用 IIFE + async/await 的“魔法组合”
(async function() {
// 创建 Promise 模拟异步任务
const p = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('success'); // 🎯 1秒后返回结果
}, 1000);
});
// await 让异步变同步
const res = await p; // 🧊 等待1秒
console.log(res); // ✅ 输出 'success'
console.log('1111'); // 🔥 异步完成后继续执行
})();
// 代码执行顺序:
// 1. IIFE 立即执行
// 2. 创建异步任务(1秒后完成)
// 3. await 暂停函数,1秒后继续
// 4. 最终输出 'success' 和 '1111'
</script>
关键点解析:
- IIFE 的作用:
(async function() { ... })()这种写法会立即执行函数,适合一次性异步任务 - await 的暂停效果:代码在
await p处暂停,直到Promise完成 - 异步与同步的融合:最终输出顺序是
success→1111,仿佛时间被“冻结”再“解封”
💡 类比记忆:
- IIFE 就像“立刻施法”,async/await 是“时间暂停术”
- 两者结合,能让你在异步世界里优雅地“卡点输出”!
🎉 6. 总结:异步编程的“人生哲学”
| 核心概念 | 类比 | 关键点 |
|---|---|---|
| 同步 vs 异步 | 煮咖啡 vs 外卖 | 同步代码霸占CPU时间片 |
| Promise | 画饼 | 异步完成后兑现承诺 |
| async/await | 空调 | 异步代码同步式写法 |
| IIFE + async | 魔法咒语 | 立即执行异步任务 |
💡 异步编程的本质:把“等外卖”的被动等待,变成“画饼吃饼”的主动掌控!
🔥 掌握 Promise,你就是异步世界的掌控者!
🚀 从今天起,用 Promise 带飞你的异步代码!