Javascript提高:JavaScript Promise 超通俗解释-由Deepseek产生

JavaScript Promise 超通俗解释

Promise 是 JS 中专门用来处理异步操作的对象,它解决了传统回调函数的「回调地狱」问题,让异步代码(比如请求接口、读取文件、定时器)写起来像同步代码一样清晰、好维护。

简单说:Promise 就是一个"承诺" ------ 异步操作现在没结果,但未来一定会给你一个结果(成功/失败)。


1. Promise 的三种状态

Promise 一生只有 3 种状态,状态一旦改变就固定,不可逆

  1. pending(等待中):初始状态,异步任务正在执行(比如接口还没返回、定时器还没到时间)
  2. fulfilled(已成功):异步任务执行成功,会返回结果
  3. rejected(已失败):异步任务执行失败,会返回错误

状态变化只有两种:

  • pending → fulfilled(成功)
  • pending → rejected(失败)

2. 基础语法:创建和使用 Promise

① 创建 Promise

new Promise() 构造函数,里面包裹异步代码:

javascript 复制代码
// 定义一个 Promise 函数
function waitTime(time) {
  // 返回 Promise 对象
  return new Promise((resolve, reject) => {
    // 异步操作:定时器
    setTimeout(() => {
      if (time > 0) {
        // ✅ 成功:调用 resolve,把结果传出去
        resolve(`等待了 ${time} 毫秒,执行成功`);
      } else {
        // ❌ 失败:调用 reject,把错误传出去
        reject("时间不能小于等于0");
      }
    }, time);
  });
}
  • resolve:成功时调用,把状态改为 fulfilled
  • reject:失败时调用,把状态改为 rejected

② 使用 Promise

.then() 接收成功结果,.catch() 捕获错误,.finally() 无论成功失败都会执行:

javascript 复制代码
waitTime(2000)
  .then((result) => {
    // 成功回调:拿到 resolve 的数据
    console.log(result); // 输出:等待了 2000 毫秒,执行成功
  })
  .catch((error) => {
    // 失败回调:拿到 reject 的错误
    console.error(error);
  })
  .finally(() => {
    // 最终回调:无论成功/失败都执行(常用于关闭加载、清理操作)
    console.log("异步操作结束");
  });

3. 核心优势:解决回调地狱

传统异步嵌套(回调地狱,代码嵌套多层,可读性极差):

javascript 复制代码
// 回调地狱 ❌
setTimeout(() => {
  console.log("第一步");
  setTimeout(() => {
    console.log("第二步");
    setTimeout(() => {
      console.log("第三步");
    }, 1000);
  }, 1000);
}, 1000);

用 Promise 链式调用(扁平化,逻辑清晰):

javascript 复制代码
// Promise 链式调用 ✅
waitTime(1000)
  .then(() => {
    console.log("第一步");
    return waitTime(1000); // 返回新 Promise,继续链式
  })
  .then(() => {
    console.log("第二步");
    return waitTime(1000);
  })
  .then(() => {
    console.log("第三步");
  });

4. 进阶:async/await(Promise 语法糖)

ES7 推出的 async/await 是 Promise 的最简写法,让异步代码完全像同步代码:

javascript 复制代码
// 用 async 标记函数是异步函数
async function doTask() {
  try {
    // await 等待 Promise 完成,直接拿到结果
    const res1 = await waitTime(1000);
    console.log(res1);
    
    const res2 = await waitTime(1000);
    console.log(res2);
  } catch (error) {
    // 统一捕获所有错误
    console.error(error);
  }
}

doTask();
  • await 必须写在 async 函数里
  • await 后面跟 Promise 对象,会暂停等待 Promise 完成
  • try/catch 捕获错误,替代 .catch()

5. 常用 Promise 静态方法

Promise.all()

并行执行多个 Promise,全部成功才返回结果,一个失败就整体失败(常用于批量请求接口)

javascript 复制代码
const p1 = waitTime(1000);
const p2 = waitTime(2000);
// 等待所有 Promise 完成
Promise.all([p1, p2]).then((results) => {
  console.log(results); // [结果1, 结果2]
}).catch((err) => {
  console.log("有一个失败了");
});

Promise.race()

谁先完成(成功/失败)就返回谁的结果(常用于接口超时控制)

Promise.resolve() / Promise.reject()

快速创建一个成功/失败的 Promise。


总结

  1. Promise 是异步编程解决方案,解决回调地狱,让代码更优雅
  2. 三种状态:pendingfulfilled / rejected(状态不可逆)
  3. 核心方法:.then() 成功、.catch() 失败、.finally() 最终
  4. 最简写法:async/await(Promise 语法糖)
  5. 常用工具:Promise.all() 并行执行多个异步任务
相关推荐
小陈同学呦8 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
开发者每周简报8 小时前
网海三部曲·无名宗师传
javascript·人工智能
isyangli_blog8 小时前
OpenDayLight (Carbon 版本) 启动与组件安装
开发语言·php
vb2008118 小时前
FastAPI APIRouter
开发语言·python
Benszen9 小时前
KVM虚拟化解决方案
开发语言·perl
会编程的土豆9 小时前
Go 语言反射(Reflection)详解
开发语言·后端·golang
東雪木9 小时前
多线程与并发编程 专属复习笔记
java·开发语言·笔记·java面试
杨充9 小时前
1.3 浮点型数据设计灵魂
开发语言·python·算法
噜噜噜阿鲁~9 小时前
python学习笔记 | 11.3、面向对象高级编程-多重继承
java·开发语言
basketball6169 小时前
Go 语言从入门到进阶:4. 数组和MAP使用方法总结
开发语言·后端·golang