news 2026/11/5 0:34:44

Promise 讲解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Promise 讲解

太好了,你这个问题问到 JS 异步的“命门”上了👍
我不用 ruoyi、不用 axios、不用复杂概念,只用最最简单的例子,一步一步带你理解:

什么是return new Promise,以及为什么getInfo()要这样写


一、先一句“人话”解释 Promise

Promise 就是:
“我现在给不了你结果,但我保证将来给你一个结果(成功或失败)”


二、不用 Promise 的函数(同步)

functionadd(a,b){returna+b}constresult=add(1,2)console.log(result)// 3(立刻得到)

✔ 立刻返回
✔ 用return拿结果


三、问题来了:如果结果“过一会儿”才有?

比如:1 秒后返回结果

functionaddLater(a,b){setTimeout(()=>{returna+b},1000)}

❌ 这是错的
❌return只返回给setTimeout,不是返回给函数外面

constresult=addLater(1,2)console.log(result)// undefined

四、Promise 出场(解决“将来才有结果”)

最小可运行示例

functionaddLater(a,b){returnnewPromise((resolve,reject)=>{setTimeout(()=>{resolve(a+b)// 成功},1000)})}

使用方式

addLater(1,2).then(result=>{console.log(result)// 3(1 秒后)})

👉这就是 Promise 的核心


五、Promise 三要素(必须记住)

newPromise((resolve,reject)=>{// 成功 → resolve(结果)// 失败 → reject(错误)})
东西意义
Promise承诺“将来给你结果”
resolve成功
reject失败

六、你代码里的 Promise,用“人话翻译”

你这段:

getInfo(){returnnewPromise((resolve,reject)=>{getInfo().then(res=>{...resolve(res)}).catch(error=>{reject(error)})})}

👉翻译成人话

“我这个getInfo()方法现在拿不到最终结果
我要去调后端接口

如果接口成功,我会告诉你成功(resolve)
如果接口失败,我会告诉你失败(reject)”


七、为什么不直接 return 接口?

你可能会问:

为什么不直接:

getInfo(){returngetInfo()}

因为你中间做了很多事:

this.roles=...this.name=...this.avatar=...ElMessageBox.confirm(...)

👉你在“加工数据 + 更新状态 + 触发副作用”

Promise 的作用是:

  • 包住整个异步流程

  • 告诉外面:

    • 什么时候全部做完
    • 是否成功

八、路由守卫为什么能.then()

在路由守卫里:

useUserStore().getInfo().then(()=>{// 这里保证:用户信息已经准备好了})

如果getInfo()不 return Promise:

❌.then会报错
❌ 路由不知道什么时候该继续


九、最最简单的对比例子(10 秒看懂)

❌ 不用 Promise(错误)

functionloadUser(){setTimeout(()=>{return{name:'张三'}},1000)}constuser=loadUser()console.log(user)// undefined

✅ 用 Promise(正确)

functionloadUser(){returnnewPromise(resolve=>{setTimeout(()=>{resolve({name:'张三'})},1000)})}loadUser().then(user=>{console.log(user.name)// 张三})

十、你只要记住这一句话

凡是“要等”的事(接口、定时器、异步),
就必须用 Promise 把结果“装起来”再 return


十一、进阶但很重要的一点(悄悄告诉你)

你这个代码其实可以简写成:

asyncgetInfo(){constres=awaitgetInfo()...returnres}

等你理解 Promise 后,再学async / await会秒懂。


如果你愿意,下一步我可以:

  • 🔁 用生活类比再讲一次 Promise
  • 🧠 把这段改写成async/await版
  • 🧪 给你画执行顺序时间线

你直接说:
“用 async/await 重写给我看”或“再举一个更傻的例子”

这个问题问得非常非常好,而且你已经抓到Promise 最容易让人卡住的点了 👍
我们慢慢来,用一句话 + 图解式文字 + 对比代码,把这个疑问彻底打穿。

问题:Promise如何取值?

一、先给你一句“结论版答案”

Promise 里不需要return resolve(...),
因为你 return 的不是“结果”,
而是在“通知 Promise:结果已经准备好了”。


二、你真正困惑的点是什么?

你看到的是👇

returnnewPromise(resolve=>{setTimeout(()=>{resolve({name:'张三'})},1000)})

你心里想的是:

“这里既没有return { name: '张三' },
那外面的.then(user => ...)是怎么拿到的?”

这个问题100% 正常。


三、关键区别:returnvsresolve

1️⃣return是“函数返回值”

functionf(){return123}
  • 返回给调用者
  • 同步、立刻

2️⃣resolve是“Promise 状态通知”

resolve(123)
  • 不返回给调用者
  • 告诉 Promise:我成功了,值是 123

👉 Promise 自己会保存这个值


四、把 Promise 拆成“两个世界”(非常重要)

🌍 世界一:Promise 外面

constp=loadUser()
  • 你立刻拿到的是一个Promise 对象
  • 不是{ name: '张三' }
p.then(user=>{console.log(user)})

🌍 世界二:Promise 里面

newPromise((resolve,reject)=>{// 这里是 Promise 内部世界})
  • 这里的resolve是Promise 给你的“按钮”
  • 你按下它,Promise 才知道结果

五、用“快递”打个比方(最好理解)

你写的代码相当于:

functionloadUser(){// 创建一个快递单(Promise)returnnewPromise(resolve=>{// 1 秒后把包裹交给快递公司setTimeout(()=>{resolve({name:'张三'})// 📦 包裹内容},1000)})}

重点:

  • return new Promise(...)

    • 👉把快递单交给你
  • resolve({ name: '张三' })

    • 👉快递公司真正把货送到

📌不是用 return 送货,是用 resolve 送货


六、为什么resolve不需要 return?

来看这个:

setTimeout(()=>{resolve({name:'张三'})return999},1000)

👉return 999完全没用

因为:

  • setTimeout的回调函数
  • 没有人关心它的 return

真正重要的是你调用了resolve()


七、Promise 内部发生了什么(简化版)

constpromise=newPromise(resolve=>{resolve(123)})

Promise 内部等价于:

promise.value=123promise.state='fulfilled'

然后当你写:

promise.then(value=>{console.log(value)})

Promise 会:

“哦,我已经成功了,那我把保存的 value 给你”


八、一个对比例子(秒懂)

❌ 用 return(错)

functionwrong(){returnnewPromise(resolve=>{return123})}wrong().then(v=>console.log(v))// undefined

👉 因为你没调用 resolve


✅ 用 resolve(对)

functionright(){returnnewPromise(resolve=>{resolve(123)})}right().then(v=>console.log(v))// 123

九、最关键的一句话(请记住)

Promise 的返回值只有一个:Promise 本身
真正的数据,是通过 resolve 传给 then 的


十、等你下一步一定会问的问题(我先告诉你)

“那为什么 async/await 可以直接 return?”

因为:

asyncfunctionf(){return123}

等价于:

functionf(){returnPromise.resolve(123)}

如果你愿意,下一步我可以:

  • 🔁 用async / await 把你刚才的例子改一遍
  • 🧠 画一条Promise 执行时间线
  • 🧪 解释resolve vs reject vs throw

你直接说一句:
“画时间线”或“讲 async/await”就行。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/11/3 8:54:41

智谱AI重磅开源Open-AutoGLM(AutoGLM应用全指南)

第一章:智谱开源Open-AutoGLM模型智谱AI近期正式开源了其自动化生成语言模型——Open-AutoGLM,该模型旨在降低大模型应用门槛,提升自然语言处理任务的自动化水平。Open-AutoGLM基于自研的AutoGLM框架构建,支持零样本、少样本场景下…

作者头像 李华
网站建设 2026/11/3 3:40:48

京东最新e卡 滑块逆向

声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 逆向分析 部分python代码 data cp.c…

作者头像 李华
网站建设 2026/11/3 3:40:56

【AI点单革命】:Open-AutoGLM点咖啡的5大核心技术突破

第一章:Open-AutoGLM点咖啡的技术演进与行业影响技术架构的迭代路径 Open-AutoGLM点咖啡作为首个将大语言模型与实体消费场景深度融合的自动化系统,其技术演进经历了从规则引擎到语义理解,再到端到端自主决策的跨越。早期版本依赖预设菜单关键…

作者头像 李华
网站建设 2026/11/3 3:40:49

开源项目推荐:GPT-SoVITS成语音克隆领域黑马

GPT-SoVITS:语音克隆新范式,1分钟数据如何重塑声音定制? 在虚拟主播的直播间里,一个与真人声线几乎无法分辨的AI声音正流畅地讲解产品;在听障儿童的语音训练软件中,母亲的声音被复刻成耐心的教学助手&#…

作者头像 李华
网站建设 2026/11/3 1:52:05

C++虚基类表(vbtable)内存布局详解

C虚基类表(vbtable)内存布局详解 1. 虚基类概述与技术背景 虚基类是C中解决多重继承环境下基类成员重复存储问题的技术机制。通过virtual关键字声明继承关系,可以确保派生类在内存中仅保留基类成员的一份拷贝,从而有效消除数据冗余…

作者头像 李华
网站建设 2026/11/3 1:03:35

GPT-SoVITS训练数据多样性对音质的影响研究

GPT-SoVITS训练数据多样性对音质的影响研究 在虚拟主播直播带货、AI有声书自动朗读、失语者语音重建等场景日益普及的今天,个性化语音合成已不再是实验室里的前沿技术,而是正快速走向大众化与轻量化。用户不再满足于“能说话”的机械语音,而是…

作者头像 李华