🚀 JS 新手必看:用 Promise 控制异步世界的“时间魔法”!

87 阅读4分钟

🧠 1. 同步 vs 异步:CPU 的“多线程”幻想

image.png

☕️ 煮咖啡 vs 等外卖

  • 同步就像煮咖啡:你必须等咖啡机咕噜咕噜做完才能喝。代码必须按顺序执行,比如同步的 console.logfor 循环。
  • 异步就像点外卖:你点完单后继续刷手机(执行后续代码),外卖小哥送餐时再通知你(执行回调)。

🧪 1.html 实验现场

<script>
  setTimeout(() => {
    console.log('222'); // 🤯 异步任务会先跳过这里!
  }, 10);

  console.log('1111'); // 🔥 先执行同步代码
  for(let i = 0; i < 100; i++){
    console.log('2222'); // 💡 同步代码阻塞后续
  }
</script>

输出顺序揭秘

  1. 1111(同步代码立即执行)
  2. 100个 2222(同步循环阻塞主线程)
  3. 222(异步任务最后执行)
    👉 异步代码不会阻塞同步代码,但同步代码会“霸占”CPU时间片!

🎯 2. Promise 是什么?“画饼”的艺术!

image.png

🎭 画饼三连击

  • 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>

执行顺序

  1. 333(构造函数同步执行)
  2. 打印Promise对象(状态为pending)
  3. 222(10ms后异步任务完成)
  4. 1111(then回调被触发)
    💡 Promise 把异步流程变成同步式写法,告别回调地狱!

🔁 3. 从 .then() 到 async/await:异步控制的“进化论”

image.png

🌬️ 从手摇扇到空调

  • .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. 实战演练:调试异步代码的“三板斧”

image.png

🔍 4.html IIFE 与 await 大法

<script>
  (async () => { // 🧪 立即执行函数
    const p = new Promise(resolve => {
      setTimeout(() => {
        console.log('异步完成'); // 🕒 异步任务
        resolve();
      }, 1000);
    });

    console.log('开始等待...'); // 🚨 异步代码会跳过这里
    await p; // ⏸️ 暂停函数执行,等待Promise完成
    console.log('继续执行'); // ✅ 等待结束后继续
  })();
</script>

调试小贴士

  1. console.log 插眼法:在关键位置加日志追踪执行顺序
  2. 断点调试:Chrome DevTools 中设置断点,观察Promise状态变化
  3. 时间轴分析:Performance 面板查看异步任务耗时

🧩 5. 立即执行函数 + async/await:异步世界的“魔法咒语”

image.png

🧙‍♂️ 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>

关键点解析

  1. IIFE 的作用(async function() { ... })() 这种写法会立即执行函数,适合一次性异步任务
  2. await 的暂停效果:代码在 await p 处暂停,直到Promise完成
  3. 异步与同步的融合:最终输出顺序是 success1111,仿佛时间被“冻结”再“解封”

💡 类比记忆

  • IIFE 就像“立刻施法”,async/await 是“时间暂停术”
  • 两者结合,能让你在异步世界里优雅地“卡点输出”!

🎉 6. 总结:异步编程的“人生哲学”

image.png

核心概念类比关键点
同步 vs 异步煮咖啡 vs 外卖同步代码霸占CPU时间片
Promise画饼异步完成后兑现承诺
async/await空调异步代码同步式写法
IIFE + async魔法咒语立即执行异步任务

💡 异步编程的本质:把“等外卖”的被动等待,变成“画饼吃饼”的主动掌控!
🔥 掌握 Promise,你就是异步世界的掌控者

image.png

🚀 从今天起,用 Promise 带飞你的异步代码!