Promise 基础概念与实践详解

在支持 ES6 的高级浏览器环境中,我们通过 new Promise() 即可构造一个 Promise 实例。这个构造函数接受一个函数作为参数,该函数分别接收两个参数 resolvereject,用于将当前实例的状态改变为 已完成已拒绝

一、Promise 实例与构造函数核心特性

  • 实例方法 :Promise 实例可通过 .then 方法注册回调函数,根据实例状态(已完成/已拒绝)执行对应回调。
  • 状态控制 :通过 new Promise() 构造函数的回调函数可动态更改实例状态。
  • 本质:Promise 并非新语法,而是一个新函数。
  • 执行机制:Promise 同步注册,异步执行。

二、Promise 链式调用示例

javascript 复制代码
function promise1() {
    return new Promise(function(resolve, reject) {
        // 定义异步操作
        setTimeout(function() {
            console.log('1s 后输出');
            // 执行 resolve 标记为已完成,继续执行 then 链
            resolve();
        }, 1000);
    });
}

function promise2() {
    return new Promise(function(resolve) {
        setTimeout(function() {
            console.log('2s 后输出');
            resolve();
        }, 2000);
    });
}

// 链式调用写法
promise1().then(function() { return promise2(); });
// 简写形式
promise1().then(promise2);

执行结果:1 秒后输出 "1s 后输出",再过 2 秒输出 "2s 后输出"。

核心逻辑 :当 Promise 状态变为 已完成 (调用 resolve),则执行 .then 中的下一个 Promise 函数;若状态变为 已拒绝 (调用 reject),则进入异常处理函数。

三、Promise 状态处理与参数传递

javascript 复制代码
function promise3() {
    return new Promise(function(resolve, reject) {
        const random = Math.random() * 10; // 生成 0-10 的随机数
        setTimeout(function() {
            if (random >= 5) {
                resolve(random); // 状态变为已完成,传递参数
            } else {
                reject(random);  // 状态变为已拒绝,传递参数
            }
        }, 1000);
    });
}

const onResolve = function(val) {
    console.log('已完成: 输出的数字是', val);
};

const onReject = function(val) {
    console.log('已拒绝: 输出的数字是', val);
};

// 方式1:通过 then 接收两个回调
promise3().then(onResolve, onReject);

// 方式2:通过 catch 捕获异常
promise3().catch(onReject).then(onResolve);

// 方式3:通过 try catch 拦截
try {
    promise3().then(onResolve);
} catch (e) {
    onReject(e);
}

关键说明

  • 三种方式可拦截 已拒绝 状态的 Promise:then 的第二个参数、.catch 方法、try catch
  • resolvereject 可传递参数,供后续 .then 回调接收。

四、Promise 核心概念总结

  1. 状态机制

    • Promise 有三种状态:进行中(pending)已完成(fulfilled)已拒绝(rejected)
    • 状态仅能从 pending 转为 fulfilledrejected,且一旦变更不可逆转。
  2. 构造函数

    • ES6 中通过 new Promise(executor) 构造实例,executor 接收 resolvereject 函数。
    • 执行 resolve 使状态变为 fulfilled,执行 reject 使状态变为 rejected
  3. 链式调用

    • 通过 .then 方法在 Promise 状态为 fulfilled 时继续执行后续逻辑。
    • resolve/reject 传递的参数可被后续 .then 回调获取。
  4. 异常处理

    • 已拒绝的 Promise 可通过 .catchthen 的第二个参数或 try catch 捕获处理。
相关推荐
hhcccchh9 分钟前
学习vue第八天 Vue3 模板语法和内置指令 - 简单入门
前端·vue.js·学习
yyf1989052511 分钟前
Vue 框架相关中文文献
前端·javascript·vue.js
粥里有勺糖17 分钟前
开发一个美观的 VitePress 图片预览插件
前端·vue.js·vitepress
行者9632 分钟前
Flutter适配OpenHarmony:国际化i18n实现中的常见陷阱与解决方案
开发语言·javascript·flutter·harmonyos·鸿蒙
陟上青云36 分钟前
一篇文章带你搞懂原型和原型链
前端
我的写法有点潮37 分钟前
推荐几个国外比较流行的UI库(上)
前端·javascript·css
鹏多多42 分钟前
jsx/tsx使用cssModule和typescript-plugin-css-modules
前端·vue.js·react.js
ssshooter2 小时前
复古话题:Vue2 的空格间距切换到 Vite 后消失了
前端·vue.js·面试
IamZJT_2 小时前
拒绝做 AI 的“饲养员” ❌:前端程序员在 AI 时代的生存与进化指南 🚀
前端·ai编程
MM_MS2 小时前
Halcon控制语句
java·大数据·前端·数据库·人工智能·算法·视觉检测