Promise的回调函数传入另一个Promise的疑惑?
在阮一峰老师的《ES6标准入门》里面看到关于Promise的一个代码,让我很费解:
var p1 = new Promise(function (resolve, reject) {
setTimeout(() => reject(new Error('fail')), 3000)
})
var p2 = new Promise(function (resolve, reject) {
setTimeout(() => resolve(p1), 1000)
})
p2
.then(result => console.log(result))
.catch(error => console.log(error))
上述代码的输出结果是:Error: fail
而书上的表述是:
上面代码中,p1是一个Promise,3秒之后变为rejected。p2的状态在1秒之后改变,resolve方法返回的是p1。此时,由于p2返回的是另一个
Promise,所以后面的then语句都变成针对后者(p1)。又过了2秒,p1变为rejected,导致触发catch方法指定的回调函数。
这个就让我觉得很费解了。
为什么p2后跟的then针对的是p1而不是p2本身呢?
p2中resolve(p1)这个到底发生了什么呢?为什么说“resolve方法返回的是p1”?resolve方法在此处不是应该是
.then(result => console.log(result))
吗?它返回undefined
的呀?如果我就是想在控制台中打印出p1这个对象本身,即可以查看p1的属性等等,那么p2的then的回调函数代码应该怎么写呢?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
首先,从简单的 Promise 理解开始。先别扯 Promise 嵌套的问题。因为最朴素的 Promise 概念你就弄错了。
看起来 Promise 里的
resolve
方法就像是then
方法传递过来的这个回掉函数?当然不是!resolve
是指用一个值来完成
这个 promise,只有 promise resolve了,then方法注册的回掉才会被执行。同理,即使没人关心你这个 promise 是否会被 resolve,没有人用 then 注册回掉函数,resolve 照样可以正常执行。为什么p2后跟的then针对的是p1而不是p2本身呢?
为什么?标准就是这样规定的啊!
标准规定,如果你用普通对象来 resolve 一个 promise,这个promise就立马拿着这个值然后变成 resolved 状态,如果你用一个 thenable 的对象,就是一个promise对象 来 resolve 另一个 promise,这个 promise 就会自动关联起来!
要在 p2.then 里拿到 p1 ?
那你别用一个 promise 对象作为值来 resolve p2 啊!
话说你又是为什么要在 then 里拿到 p1呢?拿到p1你又能干什么的?还不是调用.then 么?
话说你又是为什么要在 then 里拿到 p1呢?拿到p1你又能干什么的?还不是调用.then 么?
话说你又是为什么要在 then 里拿到 p1呢?拿到p1你又能干什么的?还不是调用.then 么?
不存在这种需求的,没道理要这样作,如果要,那你这样啊:
resolve([p1])
p2.then(([p1]) => {
// p1
})
泻药。
你没有正确理解promise中的resolve,其作用是完成promise并返回其参数值。
这里p2就是1s后resolve(p1),由于其返回值p1是promise对象,则不会进入then,会继续执行这个promise。
第三个问题感觉没有什么方法,then中是要等p1中完成才能执行。
参考 MDN 上的 Promise 和 Promise.resolve(),有如下一段话
虽然这是介绍的
Promise.resolve()
静态方法,而且文档中也没提到对new Promise()
executor 的resolve()
适应,但实际效果表示二者处理方式是一样的。resolve 会对 thenable 的对象剥开处理的。
所以你想返回 p1 的话可以对其包一层对象,比如
resolve({p1})