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


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

目录
相关文章
|
7月前
|
前端开发 JavaScript 测试技术
6 # 实现简单的 promise
6 # 实现简单的 promise
22 0
|
前端开发
promise的resolve,reject,all方法
promise的resolve,reject,all方法
172 0
|
6天前
|
前端开发
对Promise的理解
对Promise的理解
17 2
|
5月前
|
前端开发
Promise
Promise
34 1
|
9月前
|
前端开发
对promise的理解分享
对promise的理解分享
|
9月前
|
前端开发
什么是promise,解决了什么
什么是promise,解决了什么
112 0
|
10月前
|
前端开发 JavaScript
深入理解Promise
深入理解Promise
70 0
|
前端开发
理解和使用Promise.all和Promise.race
理解和使用Promise.all和Promise.race
|
前端开发 JavaScript
探索Promise的应用
探索Promise的应用
|
前端开发 API
对promise的一点了解
所谓 Promise,就是一个对象,用来传递异步操作的消息。它代表了某个未来才会知道结果的事件(通常是一个异步操作),并且这个事件提供统一的 API,可供进一步处理。
93 0