Promise中的resolved和fulfilled到底什么关系,又或者这只是叫法的问题?

发布于 2022-09-11 22:28:09 字数 1911 浏览 13 评论 0

Promise中的resolved和fulfilled到底什么关系,又或者这只是叫法的问题?

问题:promise中总会遇到说resolved和fulfilled这两个关键词的,但是有时候总会有那么一丝儿误解或者是朦胧,有时候傻傻分不清,怎么上面说fulfilled状态,下面又变成了resolved状态!?(‘.’)囧

我的理解:

  我知道Promise构造函数接受一个函数作为参数吗,并且该函数可以接受两个参数(也是方法,由js引擎提供)resolve,reject,两个词分别的意思是 “解决”“拒绝,丢弃”。字面上很好理解,其实就是通过这两个方法将Promise的状态由pending转化为fulfilled和rejected的。
     pending -> resolve方法 -> fulfilled
     pending -> reject方法 -> rejected
  由此可以见我的理解就是那些说什么resolved的就是fulfilled状态的,从英语的语法resolved的是resolve的过去式,那就是说“解决了”,那不就是代表了解决了就成功了,所以按照上面流程也正是fulfilled的状态吗,那resolved和fulfilled同一状态咯
  但是从另一个角度又感觉站不住脚,应为解决了就一定是成功了吗???!!!想得有点(‘.’)
另外引阮神的《ECMAScript 6 入门》
promise章节的部分段落
   从这个话语中很明显知道,阮神指的resolved也正是我的困扰点,他这里说的明显可以看出来resolved暂指fulfilled状态,要是不是本文呢,要是实际过程中呢,resolved不一定表示状态变为fulfilled状态了,而是会有其他可能,比如说转变为了rejected状态了呢?!

紧接着问一句,catch,then等回调函数返回的都是resolve的Promise,

图片描述

   那么请再一次允许我引阮神的promise.all中的原句子:
上面代码中,promises是包含 6 个 Promise 实例的数组,只有这 6 个实例的状态都变成fulfilled,或者其中有一个变为rejected,才会调用Promise.all方法后面的回调函数。
   所以只有这有状态都变为fulfilled才能执行all后面的回调函数咯!!!

图片描述
   上图就是描述其实就是:all里面的promise有自己的catch方法时,该promise变为rejected时触发的是自己promise的catch方法,不会触发all方法外面接着的promise的catch方法

   原因很简单:子catch方法回调结束后返回又是一个resolved状态的promise,所以最终接受的子都是resolved的状态的

好了,收尾提问就是

   通过上面的Promise.all方法直接引出的问题和之前的一些佐证,那说到底resolved是不是就是fulfilled状态呢???
   又或者resolved对应的还有其他状态呢,怎么实现resolved对应另外一种状态(rejected)的呢???

还望各位大神伸手救救弟弟呀,Thanks♪(・ω・)ノ,弟弟实在是渴望吧这些总是困扰着我的事实弄得明明白白的

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

瞳孔里扚悲伤 2022-09-18 22:28:09

阮一峰的文章。。。
建议还是看 MDN 比较好,《ECMAScript 6 入门》已经被我用来垫屏幕了


pending -> resolve方法 -> fulfilled -> resolved
pending -> reject方法 -> rejected -> resolved

一开始是 pending,无论 resolve 还是 reject,都是 resolved,这里指得是完成、不会再改变了的状态;对应的 pending 就是尚未完成的状态。

fulfilled 是一种 resolved
rejected 也是一种 resolved


紧接着问一句,catch,then等回调函数返回的都是resolve的Promise,

你需要知道,chrome 控制台会在按下回车之后显示执行语句的返回值
然后呢,then 会自动把返回值包裹成 Promise,然后再将其自动展开:

Promise.resolve(42).then(x => x / 10);
// 一样
Promise.resolve(42).then(x => Promise.resolve(x / 10));

这是当初设计时的一个 bug/feature,详情可以看 https://github.com/promises-a... 这个讨论

鹿! 2022-09-18 22:28:09

所以你问的问题到底是什么呢?
碰到问题应该去查规范吧。

规范中定义了Promise Object只有3种状态fulfilledrejectedpending

放手` 2022-09-18 22:28:09

Promise-objects:

Any Promise object is in one of three mutually exclusive states: fulfilled, rejected, and pending:

  • A promise p is fulfilled if p.then(f, r) will immediately enqueue a Job to call the function f.
  • A promise p is rejected if p.then(f, r) will immediately enqueue a Job to call the function r.
  • A promise is pending if it is neither fulfilled nor rejected.

A promise is said to be settled if it is not pending, i.e. if it is either fulfilled or rejected.

A promise is resolved if it is settled or if it has been “locked in” to match the state of another promise. Attempting to resolve or reject a resolved promise has no effect. A promise is unresolved if it is not resolved. An unresolved promise is always in the pending state. A resolved promise may be pending, fulfilled or rejected.

Promise 只有三种状态:pending, fulfilled, rejected 。

fulfilled 和 rejected 统称 settled 。

resolved 是指,Promise 已经 settled ,或者已经使用另一个 promise (B) 来 resolve 了(此时 Promise 的状态将由 B 来决定,可能 pending、fulfilled、rejected 的任何一种)。

pending -> resolve方法 -> fulfilled

这个是不对的,resolve 只有会是 resolved ,但是不一定是 fulfilled,也不一定最终转换为 fulfilled,有可能最终转变为 rejected 。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文