var p1=new Promise(resolve => {
console.log(1)
resolve(2)
})
var p2=new Promise(resolve => {
console.log(3)
resolve(p1)
})
p1.then(re => {
console.log(re)
})
p2.then(re => {
console.log(re)
})
var p1=new Promise(resolve => {
console.log(1)
resolve(2)
})
var p2=new Promise(resolve => {
console.log(3)
resolve(p1)
})
p1.then(re => {
console.log(re)
})
p2.then(re => {
console.log(re)
})
js的事件循环机制可以看这个浏览器和Node不同的事件循环(Event Loop)
剩下的就是resolve(promise)和resolve(1)
的问题了。
浏览器比node会多输出一个promise对象,你可以把它理解为整个代码块的返回值
,它应该是最后一个语句的.then
的返回值。具体解释见另一个答案下的评论。
相信大家对前面132,理解都没问题
后面一个2,其实是promise A+规范,我看上面好像都没有提到
var p2=new Promise(resolve => {
console.log(3)
resolve(p1)
})
在规范里,写作 [[Resolve]](promise, x) :即使用x resolve promise
规范规定:
此处是第二种情况
其实有两个栈
开始执行主栈,p1执行,输出1,resolve的后面的then放在次栈中
p2执行,输出3,,resolve的后面的then放在次栈中
主栈里的执行完后,再去顺序执行次栈里的
这两个栈其实有专有名词的,忘了叫啥了
p1和p2的new操作是在js主线程上执行,按照先后顺序同步的方式执行你传给promise的函数,而promise实例p1和p2中then方法注册的回调任务是异步执行的,所以先输出1和3。而又因为p2必须等p1 resolve之后才能执行then逻辑,所以一定是先输出p1的2,等p1 resolve之后,p2才会resolve,然后执行p2的then逻辑在输出一个2.
8 回答4.4k 阅读✓ 已解决
6 回答3k 阅读✓ 已解决
5 回答2.6k 阅读✓ 已解决
5 回答6.2k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
3 回答2.4k 阅读
4 回答2.7k 阅读✓ 已解决
第一步,初始化
p1
打印
1
第二步,初始化
p2
打印
3
第三步,执行
p1
的then
方法打印
2
第三步,执行p2
的then
方法,在此方法中又调用p1
,而p1
resolve
的是2
,所以先打印
2
,再打印p1对象为Promise
感谢@toBeTheLight
补充说明:
修改上面最后一步:
第四步:执行
p2
的then
方法,在此方法中又调用p1
,此时,p1已经处于resolved状态,所以返回2
.打印
2
.Promise对象是浏览器打印出来,node中执行并没有。详细解决请参考@toBeTheLight 的回答。