关于promise then的问题
let p1=new Promise(resolve=>{
resolve()
})
let p2=p1.then(data=>{
return p2
}).then(res=>{
console.log(res,'res')
})
为什么这样promise什么输出都没 也没有报错
let p1=new Promise(resolve=>{
resolve()
})
let p2=p1.then(data=>{
return p2
})
这样就会报错Uncaught (in promise) TypeError: Chaining cycle detected for promise #<Promise>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
then 会返回一个 promise ,这个 promise 使用它的回调的返回值来 resolve 的。
所以在上面,
p1.then
返回的pp1
,是用p2
resolve 的。pp1.then
返回的pp2
,也就是 p2 ,是用回调返回的undefined
resolve 。而,p2 是一个 promise 。所以,
pp1
要等p2
resolve 了它自己才能 resolve ,然后才能调用pp1.then
的回调。同时,p2 要等
pp1.then
的回调被调用并返回之后才能 resolve 。于是互相等,谁也 resolve 不了。死锁。
pp1.then
的回调不会被调用。这个就是用
p2
resolvep2
了。javascript 规定自己resolve自己是一个运行时错误 TypeError使用有错误,promise返回自身会死循环。
一个promise对象只能是三种三种状态:
pending
(进行中)、fulfilled
(已成功)和rejected
(已失败),并且不可逆,当标记成完成后,promise就结束了。正确用法是。
promise里不能返回promise本身,会造成无限循环。
至于promise返回自身后再追加then不报错,我猜测是因为promise实现代码中的逻辑是在执行promise的时候判断是否是Promise对象,如果是Promise就判断状态,状态时pending,就继续执行,如果有then、catch、finally方法就执行这些方法把promise的状态更改掉,循环就结束了。
但是如果没有thencatchfinally这些方法,那就可能会死循环,所以Promise的源码可能做了检查然后报出了这个错误提示,或者没有做检查,真的是运行时报的这个错。
我没有在V8的源码里找到相关的逻辑,下面是我的推测的伪代码,供参考