嗨,大家好!这里是道长王jj~ 🎩🧙♂️
Promise.resolve()
,如果它返回一个已经完成的Promise,为什么不将其命名为 Promise.fulfill()
之类的名称?Promise.resolve()
是一个很奇怪的名字,不是吗?🤔它返回一个已经完成的Promise,但它听起来像是要解决一个问题。🤷♂️
为什么不叫 Promise.fulfill()
呢?这样就可以和Promise的状态 fulfilled
对应起来。😊
还有,你还记得Promise函数的第一个参数吗?它也叫 resolve()
,但它其实就是把Promise变成 fulfilled
的魔法棒。✨
这个词也很奇怪,为什么不叫 fulfill()
呢?🙄
是什么决定了Promise是已解决还是未解决?
我们知道 Promise 它可以有三种状态: pending
、 fulfilled
和 rejected
。🤔
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,或者是跟着别的 Promise 的 Promise。这样的 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。👍
🎉 你觉得怎么样?这篇文章可以给你带来帮助吗?当你处于这个阶段时,你发现什么对你帮助最大?如果你有任何疑问或者想进一步讨论相关话题,请随时发表评论分享您的想法,让其他人从中受益。🚀✨