《Promise 的 resolve 和 reject 详解:从入门到实战,让你的异步代码更优雅!》

Promise 核心:resolve 和 reject 完全指南(附实战示例)

🔍 引言

在 JavaScript 中,Promise 是处理异步操作的强大工具,而 resolvereject 是它的核心方法。它们决定了 Promise 的成功或失败状态,让异步代码更易读、更易维护。

本文将带你深入理解 resolvereject 的用法,并通过 3 个实战示例 让你彻底掌握!


📚 1. resolve 和 reject 是什么?

Promise 构造函数接收一个 执行器函数(executor),该函数有两个参数:

  • resolve(value):表示操作成功,将 Promise 状态改为 fulfilled(已完成),并返回结果 value
  • reject(reason):表示操作失败,将 Promise 状态改为 rejected(已拒绝),并返回错误信息 reason

基本结构

const myPromise = new Promise((resolve, reject) => {
  if (/* 操作成功 */) {
    resolve("成功的数据");
  } else {
    reject("失败的原因");
  }
});

🚀 2. 如何使用 resolve 和 reject?

✅ 示例 1:模拟异步请求

function fetchData() {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      const success = Math.random() > 0.5; // 模拟50%成功率
      if (success) {
        resolve("数据获取成功!");
      } else {
        reject(new Error("网络请求失败!"));
      }
    }, 1000);
  });
}

// 调用方式(then/catch)
fetchData()
  .then(data => console.log(data))
  .catch(error => console.error(error));

// 或使用 async/await
(async () => {
  try {
    const data = await fetchData();
    console.log(data);
  } catch (error) {
    console.error(error);
  }
})();

✅ 示例 2:封装 HTTP 请求(如 Axios)

function getQiniuToken() {
  return new Promise((resolve, reject) => {
    axios.get('/help/token/qiniu')
      .then(res => resolve(res.data))  // 成功时调用 resolve
      .catch(err => reject(err));     // 失败时调用 reject
  });
}

// 使用方式
getQiniuToken()
  .then(token => console.log("Token:", token))
  .catch(err => console.error("获取 Token 失败:", err));

✅ 示例 3:文件上传(结合 uni.uploadFile)

function uploadToQiniu(filePath, token) {
  return new Promise((resolve, reject) => {
    uni.uploadFile({
      url: 'https://upload.qiniup.com',
      filePath,
      name: 'file',
      formData: { token },
      success: (res) => resolve(JSON.parse(res.data)),
      fail: (err) => reject(err)
    });
  });
}

// 调用方式
uploadToQiniu('path/to/image.png', 'your-token')
  .then(res => console.log("上传成功:", res))
  .catch(err => console.error("上传失败:", err));

💡 3. 为什么用 resolve/reject 而不是直接 return?

  1. 异步操作无法直接 return(如 setTimeoutfetchaxios)。
  2. 统一错误处理,可以用 .catch() 捕获所有错误。
  3. 支持链式调用.then().then().catch())。
  4. 兼容 async/await,让代码更同步化。

🎯 4. 最佳实践

resolve 传有效数据,如 resolve(data)
reject 传 Error 对象,如 reject(new Error("失败原因"))
避免嵌套 Promise,尽量用 return + .then() 链式调用。
始终处理错误,用 .catch()try/catch 防止未捕获的异常。


📌 结论

resolvereject 是 Promise 的核心,掌握它们能让你的异步代码更清晰、更健壮。本文通过 3 个实战示例 带你彻底理解它们的用法,现在你可以在项目里灵活运用了!

💬 你有关于 Promise 的问题吗?欢迎在评论区交流! 🚀


🔗 相关推荐

📢 关注我,获取更多前端技术干货! 🎉


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值