问题描述看了一段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方法,循环执行下去,直到链式方法的结束。

泛舟湖上清波郎朗
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})
添加回答
举报
0/150
提交
取消