🤔 为什么是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。👍


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

目录
相关文章
|
6月前
|
前端开发 JavaScript
Promise、async和await
Promise、async和await
65 0
|
前端开发 JavaScript 测试技术
6 # 实现简单的 promise
6 # 实现简单的 promise
38 0
|
前端开发
promise的resolve,reject,all方法
promise的resolve,reject,all方法
222 0
|
12天前
|
前端开发 JavaScript 开发者
Async 和 Await 是基于 Promise 实现
【10月更文挑战第30天】Async和Await是基于Promise实现的语法糖,它们通过简洁的语法形式,借助Promise的异步处理机制,为JavaScript开发者提供了一种更优雅、更易于理解和维护的异步编程方式。
20 1
|
12天前
|
JSON 前端开发 JavaScript
浅谈JavaScript中的Promise、Async和Await
【10月更文挑战第30天】Promise、Async和Await是JavaScript中强大的异步编程工具,它们各自具有独特的优势和适用场景,开发者可以根据具体的项目需求和代码风格选择合适的方式来处理异步操作,从而编写出更加高效、可读和易于维护的JavaScript代码。
19 1
|
1月前
|
前端开发 JavaScript
setTimeout、Promise、Async/Await 的区别
`setTimeout` 是用于延迟执行函数的简单方法;`Promise` 表示异步操作的最终完成或失败;`Async/Await` 是基于 Promise 的语法糖,使异步代码更易读和维护。三者都用于处理异步操作,但使用场景和语法有所不同。
|
6月前
|
前端开发
promise和async的区别是什么?
promise和async的区别是什么?
83 1
|
6月前
|
前端开发
对Promise的理解
对Promise的理解
42 2
|
6月前
|
前端开发
async/await返回的promise被解析为undefined的可能原因
`async/await` 通常与 `Promise` 一起使用,但如果返回的 `Promise` 被解析为 `undefined`,可能有几个原因。以下是一些可能的情况和解决方法
|
6月前
|
前端开发 JavaScript
return和reject、resolve的配合使用
return和reject、resolve的配合使用
136 0