🤔 为什么是Promise.resolve()而不是Promise.fulfill()

简介: `Promise.resolve()` ,如果它返回一个已经完成的Promise,为什么不将其命名为 `Promise.fulfill()` 之类的名称?**`Promise.resolve()`** 是一个很奇怪的名字,不是吗?🤔它返回一个已经完成的Promise,但它听起来像是要解决一个问题。🤷‍♂️

嗨,大家好!这里是道长王jj~ 🎩🧙‍♂️

Promise.resolve() ,如果它返回一个已经完成的Promise,为什么不将其命名为 Promise.fulfill() 之类的名称?Promise.resolve() 是一个很奇怪的名字,不是吗?🤔它返回一个已经完成的Promise,但它听起来像是要解决一个问题。🤷‍♂️

为什么不叫 Promise.fulfill() 呢?这样就可以和Promise的状态 fulfilled 对应起来。😊

还有,你还记得Promise函数的第一个参数吗?它也叫 resolve() ,但它其实就是把Promise变成 fulfilled 的魔法棒。✨

这个词也很奇怪,为什么不叫 fulfill() 呢?🙄

是什么决定了Promise是已解决还是未解决?

我们知道 Promise 它可以有三种状态: pendingfulfilledrejected 。🤔

Promise要么是已解决的,要么是未解决的。😯

那么,谁来决定Promise是已解决还是未解决呢?🙋‍♂️

我们之前学过的 Promise,都是代表一个单个的异步操作。我们给它加上 then() 的处理程序,就可以拿到它的结果,然后返回一些东西,比如对象、字符串、数字或者 undefined 之类的。这样,then() 返回的 Promise 就会根据我们返回的东西来决定它的状态。

Promise.resolve("Hello world!")
  .then(response => ({
   name: response }))
  .then( repos => repos.name )
  .catch(error => console.error(error));

比如说,在这个例子里,第一个 then() 返回了一个对象,那么它返回的 Promise 就会用这个对象来实现。第二个 then() 返回了一个字符串,那么它返回的 Promise 就会用这个字符串来实现。

可是,如果我们在 then() 里面返回的不是简单的东西,而是另一个 Promise 呢?🤔 这样会怎么样呢?它返回的 Promise 会不会跟着这个 Promise 的状态走呢?

如果Promise中返回Promise

有时候,我们需要在网上找两次东西。比如说,我们想知道某个明星的生日,然后再根据生日查他的星座。这样,我们就要先发一个网络请求,拿到明星的生日,然后再发另一个网络请求,查他的星座。我们不能一次就把两个请求都发出去,因为我们要等第一个请求的结果才能发第二个请求呀。🙄

Promise.resolve("Hello world!")
  .then(response => ({
   name: response }))
  .then( repos => Promise.resolve({
   
                                    name: repos.name,
                                    description: 'yeahhhhhhhhhhhhhhhhhhhhhhhh~'
                                }))
  .then( repoInfo => {
   
        console.log("Name: ", repoInfo.name);
        console.log("Description: ", repoInfo.description);
    })
  .catch(error => console.error(error));

上一个例,还记得吗,我们用 Promise.resolve 返回了一个字符串,然后用这个字符串再做了一次 Promise.resolve,最后拼出了一个对象。

你有没有发现这里有点不一样的地方?🤔 我们在 then 里面返回了一个 Promise,而不是像以前那样返回一些简单的东西。

这就好比你和你的朋友去吃冰淇淋,你要在香草和巧克力之间选一个。你的朋友还没决定,你就懒得想了,就说:“你选什么我就吃什么。”这样你就跟着你朋友走了。如果他选了巧克力,你就吃巧克力🍫。如果他选了香草,你就吃香草🍦。

同理,第二个 then 也不会自己决定它的状态,而是跟着里面的 Promise 走。如果里面的 Promise 还在等待,第二个 then 也会等待😴。如果里面的 Promise 拿到了一个值,第二个 then 也会拿到同样的值😁。

所以,第二个 then 就相当于一个 已实现的 Promise

什么是 已实现的 Promise

已实现的 Promise 就是已经有结果的 Promise,或者是跟着别的 PromisePromise。这样的 Promise,你再怎么想要改变它的状态,它都不会理你。😎

什么是 未实现的 Promise

如果你想要改变一个 Promise 的状态,它还会听你的话,那么它就是 未实现的 Promise。我们之前看过的那些例子里,我们创建的 Promise 一开始都是在等待中。我们要么给它一个值,让它实现,要么给它一个理由,让它拒绝,这样就改变了它的状态,让它不能再变了。👌

深入了解

我们来看看上一个例子里,第二个 then 是怎么变化的。当第二个 then 开始的时候,它是在等待中。这时候,它还不知道自己的结果,因为它自己的 then() 里面可能会返回或者报错,让它实现或者拒绝。

但是,当它自己的 then() 里面返回了一个 Promise,也就是里面的 Promise 的时候,第二个 then 就不再自作主张了,而是跟着里面的 Promise 走。所以,第二个 then 和里面的 Promise 都还在等待中,但是现在第二个 then 的结果已经确定了,就是一个已实现的 Promise。当里面的 Promise 后来拿到了一个值,第二个 then 也会拿到同样的值。它还是一个已实现的 Promise,但是现在它已经有结果了。

所以,这就是为什么我们用 resolve 而不用 fulfilled,因为 fulfilled 一定返回的是非Promise,但 resolve 可以返回任何东西,包括 Promise 和非 Promise。👍


🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?当你处于这个阶段时,你发现什么对你帮助最大?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨

目录
相关文章
|
1月前
|
前端开发 JavaScript iOS开发
Volta:一款优秀的前端开发 JavaScript 项目管理器
前端开发者喵喵侠分享使用 Volta 管理 Node.js 版本的实战经验。Volta 可跨平台统一管理 Node、npm、pnpm 等工具版本,支持在 `package.json` 中锁定依赖,实现项目级环境自动切换,尤其解决了 Windows 下 nvm/nvs 的兼容问题,提升团队协作效率。
211 1
|
3月前
Snipaste 截图工具安装使用教程:桌面 "贴" 图神器,高效截图不费力
Snipaste 不只是截图工具,更是让截图“活”起来的效率神器!支持快速截图(F1)、贴图置顶(F3)、缩放旋转、透明穿透等灵活操作,还可将文字颜色转为图片窗口。轻巧强大,提升办公效率必备!
679 8
Snipaste 截图工具安装使用教程:桌面 "贴" 图神器,高效截图不费力
|
7月前
|
人工智能 前端开发 架构师
Agent 2.0“三剑客”:MCP协议、A2A协议、AG-UI协议
Agent 2.0“三剑客”:MCP协议、A2A协议、AG-UI协议
|
JavaScript 前端开发 UED
事件冒泡
【10月更文挑战第29天】事件冒泡是 JavaScript 中一种强大的事件传播机制,理解和正确使用事件冒泡可以帮助开发者实现更加高效、灵活的网页交互效果。在实际开发中,需要根据具体的需求和场景,合理地利用事件冒泡,并注意处理可能出现的事件冲突和兼容性问题。
|
存储 JavaScript 前端开发
ShareDB:构建实时应用从未如此简单
ShareDB:构建实时应用从未如此简单
664 0
|
消息中间件 前端开发 JavaScript
JavaScript 线程:处理高并发任务的必备知识(下)
JavaScript 线程:处理高并发任务的必备知识(下)
JavaScript 线程:处理高并发任务的必备知识(下)
|
存储 前端开发 JavaScript
[class,SimplePromise,Promise,函数,回调函数]JavaScript之实现一个ES6Promise
  说到 ES6,Promise 是绕不过的问题;如果说 ES6 的 Class 是基于 Javascript 原型继承的封装,那么 Promise 则是对 callback 回调机制的改进。这篇文章,不谈 Promise 的实际应用;聊一下 Promise 的实现原理,从最简单的解决方案入手,一步一步的自己实现一个 SimplePromise。
271 0
(亲测)1分钟破解IDM权限,傻瓜都能学会的破解方法(番外篇:利用破解工具直接破解IDM)
Internet Download Manager (IDM)是比较好用的一款下载工具~ 上一节我讲到一种利用修改防火墙来进行阻止访问服务器,请参看这篇文章(亲测)躺着破解IDM下载权限,治疗不用破解补丁的强迫症们 比如之前我们介绍的下载百度网盘直连资源时,多线程下载速度非常不错~ 大家都知道IDM是一款收费的软件~  大家手里珍藏的应该都是来自网络上的破解版本。
15098 0
|
22天前
|
人工智能 自然语言处理 Shell
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API
本教程指导用户在开源AI助手Clawdbot中集成阿里云百炼API,涵盖安装Clawdbot、获取百炼API Key、配置环境变量与模型参数、验证调用等完整流程,支持Qwen3-max thinking (Qwen3-Max-2026-01-23)/Qwen - Plus等主流模型,助力本地化智能自动化。
32932 129
🦞 如何在 OpenClaw (Clawdbot/Moltbot) 配置阿里云百炼 API

热门文章

最新文章