JS 异步 从零讲(大白话 + 真实场景 + 可运行案例)

按顺序:回调函数 → Promise → async/await,工作最常用,直接上手。

  1. 回调函数(最原始,缺点:回调地狱)

  2. Promise(解决回调地狱,链式调用)

    new Promise((resolve, reject) => {
    //异步操作
    //成功 resolve(数据)
    // 失败 reject(错误)
    })
    .then((res) => {
    //成功处理
    })
    .catch((err) => {
    //失败处理
    });

真实场景 封装定时器异步

复制代码
 function fn(msg, delay) {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve(msg);
          }, delay);
        });
      }

链式调用

复制代码
    fn("第一步", "1000")
        .then((res) => {
          console.log(res);
          return fn("第二步", 1000);
        })
        .then((res) => {
          console.log(res);
          return fn("第三步", 1000);
        })
        .then((res) => console.log(res));

常用静态方法

Promise.all(p1,p2,p3):全部成功才成功(并行请求)

Promise.race(p1,p2):谁先完成取谁

并行 2 个接口,同时发请求

复制代码
   Promise.all([fn("A", 1000), fn("B", 2000)]).then((res) => {
        console.log(res, "Promise.all");
      });
  1. async /await(终极写法,最舒服,项目必用)

async function 函数名(){

const 结果 = await Promise对象;

}

上面的定时器 用async/await 重写

复制代码
 function fnawait(msg, delay) {
        return new Promise((resolve, reject) => {
          setTimeout(() => resolve(msg), delay);
        });
      }
      async function run() {
        const r1 = await fnawait("1", 1000);
        console.log(r1);
        const r2 = await fnawait("2", 1000);
        console.log(r2);
        const r3 = await fnawait("3", 1000);
        console.log(r3);
      }
      run();

捕获错误(try/catch)

复制代码
  async function runDetails() {
        try {
          const res = await fn("第一步", 1000);
          console.log(res);
        } catch (err) {
          console.log("出错了", err);
        }
      }
      runDetails();

一句话总结:

1.回调:嵌套地狱,不用

2.Promise:链式,解决嵌套

3.async/await 最简

完整代码:

复制代码
<!doctype html>
<html lang="zh-CN">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>练习</title>
  </head>
  <body>
    <div id="content"></div>
    <script>
      console.log("--- JS 异步 从零讲(大白话 + 真实场景 + 可运行案例) ---");
      //按顺序:回调函数 → Promise → async/await,工作最常用,直接上手。
      //1. 回调函数(最原始,缺点:回调地狱)
      // 2. Promise(解决回调地狱,链式调用)
      new Promise((resolve, reject) => {
        //异步操作
        //成功 resolve(数据)
        // 失败 reject(错误)
      })
        .then((res) => {
          //成功处理
        })
        .catch((err) => {
          //失败处理
        });
      //真实场景 封装定时器异步
      function fn(msg, delay) {
        return new Promise((resolve, reject) => {
          setTimeout(() => {
            resolve(msg);
          }, delay);
        });
      }
      //   链式调用
      fn("第一步", "1000")
        .then((res) => {
          console.log(res);
          return fn("第二步", 1000);
        })
        .then((res) => {
          console.log(res);
          return fn("第三步", 1000);
        })
        .then((res) => console.log(res));
      // 常用静态方法
      // Promise.all([p1,p2,p3]):全部成功才成功(并行请求)
      // Promise.race([p1,p2]):谁先完成取谁
      // 并行 2 个接口,同时发请求
      Promise.all([fn("A", 1000), fn("B", 2000)]).then((res) => {
        console.log(res, "Promise.all");
      });
      //   3. async /await(终极写法,最舒服,项目必用)
      // async function 函数名(){
      //     const 结果 = await Promise对象;
      // }
      //   上面的定时器 用async/await 重写
      function fnawait(msg, delay) {
        return new Promise((resolve, reject) => {
          setTimeout(() => resolve(msg), delay);
        });
      }
      async function run() {
        const r1 = await fnawait("1", 1000);
        console.log(r1);
        const r2 = await fnawait("2", 1000);
        console.log(r2);
        const r3 = await fnawait("3", 1000);
        console.log(r3);
      }
      run();
      //   捕获错误(try/catch)
      async function runDetails() {
        try {
          const res = await fn("第一步", 1000);
          console.log(res);
        } catch (err) {
          console.log("出错了", err);
        }
      }
      runDetails();
    //   一句话总结:
    //1.回调:嵌套地狱,不用
    //2.Promise:链式,解决嵌套
    //3.async/await 最简
    </script>
  </body>
</html>
相关推荐
前端之虎陈随易5 小时前
编程语言级别的Skill市场,AI Agent 的未来形态
前端·vue.js·人工智能·typescript·node.js
一路向北he5 小时前
字节钢铁军团--“提供情境,而非控制”
java·开发语言·前端
kyriewen5 小时前
豆包和千问同时关了智能体,我用它们搭的 3 个自动化全废了——迁移方案整理
前端·javascript·ai编程
前端一小卒5 小时前
我用 TypeScript 从零手写了一个 Claude Code,然后发现它的核心只有 30 行
前端·agent
铁皮饭盒6 小时前
用 Bun.cron 定时 7 月 7 日,为啥? 看图1
javascript
大圣编程7 小时前
Python中continue语句的用法是什么?
开发语言·前端·python
yuhaiqiang7 小时前
随手 vibecoding 的浏览器插件已经 6000 多次下载,聊聊他的产品设计
前端·后端·面试
格子软件7 小时前
2026年GEO贴牌代理:分布式多级分账状态机源码深度解构
java·vue.js·分布式·vue·geo
之歆8 小时前
Vue商品详情与放大镜组件
前端·javascript·vue.js
再吃一根胡萝卜8 小时前
如何把小米 MiMo 接入 CodeBuddy,打造私有 Agent
前端