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() 并行执行多个异步任务
相关推荐
fengfuyao9851 小时前
C# 高仿QQ截图工具(支持自定义快捷键)
开发语言·c#
2401_857918291 小时前
C++与自动驾驶系统
开发语言·c++·算法
GfovikS061002 小时前
C++中的函数式编程
开发语言·c++·算法
方安乐2 小时前
ESLint代码规范(一)
前端·javascript·代码规范
2401_857918292 小时前
C++中的构建器模式
开发语言·c++·算法
酉鬼女又兒2 小时前
零基础快速入门前端JavaScript Array 常用方法详解与实战(可用于备赛蓝桥杯Web应用开发)
开发语言·前端·javascript·chrome·蓝桥杯
January12072 小时前
Vue3打卡计时器:完整实现与优化方案
前端·javascript·css
happymaker06262 小时前
web前端学习日记——DAY07(js交互编程)
前端·javascript·学习
小罗和阿泽2 小时前
GUI 自动化测试 pywinauto测试框架
开发语言·python·功能测试·测试工具·pytest
尘世中一位迷途小书童2 小时前
npm 包入口指南:package.json 中的 main、module、exports
前端·javascript·架构