为了账号安全,请及时绑定邮箱和手机立即绑定

promise的源码问题,谷歌不到特来求救十分感谢

promise的源码问题,谷歌不到特来求救十分感谢

斯蒂芬大帝 2019-08-21 19:38:51
问题描述看了一段promise的源码看到这段很是不懂jsfunctionresolve(value){//value成功态时接收的终值if(valueinstanceofPromise){returnvalue.then(resolve,reject);}}你期待的结果是什么?实际看到的错误信息又是什么?promise里resolvePromise这个函数中不是已经通过if(xinstanceofPromise)elseif(x!=null&&((typeofx==='object')||(typeofx==='function')))当到resolve为什么要去判断value是不是promise呢
查看完整描述

2 回答

?
万千封印

TA贡献1891条经验 获得超3个赞

可以这么理解,接收到resolve,表示当前这一阶段的promise成功返回了,但至于返回值是什么,并不关心。
所以需要valueinstanceofPromise这层判断,如果返回的是promise,那么就进行then的操作,然后又会走进resolve方法,循环执行下去,直到链式方法的结束。
                            
查看完整回答
反对 回复 2019-08-21
?
泛舟湖上清波郎朗

TA贡献1818条经验 获得超3个赞

可以考虑下面的代码:
letpromise1=newPromise((resolve,reject)=>{
setTimeout(()=>{
resolve('promise1')
},5000)
})
letpromise2=newPromise((resolve,reject)=>{
resolve(promise1)
}).then(result=>{
console.log(result)//大概5s之后输出字符串promise1
})
当你resolve一个promise的时候,有两种结果:
把promise对象当成该promiseresolve的结果;
把promise对象resolve的结果当成该promiseresolve的结果;
如果你想要结果1,if(xinstanceofPromise)这句代码就不需要了,但是promise的规范规定的应该是结果2,所以大部分实现都会有这个if(xinstanceofPromise)判断。在浏览器实际运行上面的代码,是在大概5秒后log出字符串promise1,如果是结果1的话,应该是比较快的log出一个promise对象。再比如下面的例子:
letpromise1=newPromise((resolve,reject)=>{
setTimeout(()=>{
resolve('promise1')
},5000)
})
letpromise2=newPromise((resolve,reject)=>{
resolve('promise2')
}).then(()=>{
returnpromise1
}).then(result=>{
console.log(result)//同样是大概5s之后输出字符串promise1
})
                            
查看完整回答
反对 回复 2019-08-21
  • 2 回答
  • 0 关注
  • 312 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号