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>
相关推荐
用户11481867894846 分钟前
盲水印:DCT-QIM 从原理到踩坑
前端
程序00711 分钟前
天地图实现收货地址定位
前端·javascript·css
心梦轻舞14 分钟前
从 14 道面试题,彻底搞懂 Event Loop 与 Vue2 nextTick 底层原理
javascript
去伪存真16 分钟前
架构思考与演进:如何彻底破解 RAG 切块大小与语义完整性的工程悖论?
前端·agent
馒头不想说话25 分钟前
AI剪辑工具降低创作门槛
前端
paopaokaka_luck36 分钟前
社区服务平台(加权协同过滤推荐、Jieba中文词频分析、WebSocket实时聊天、求助处理闭环、 活动积分闭环、ECharts多维分析)
java·前端·spring boot·mysql·echarts·mybatis
墨林陌1 小时前
翻完 DeepSeek 的 GitHub 仓库,我发现 V5 的发布路已经修好了
前端
Antruly1 小时前
uvscope:Web 调试界的瑞士军刀
前端
计算机魔术师1 小时前
Anthropic S-1 披露:半年前发布的模型,已贡献不了多少收入了
前端