FE-DSHUI / DSHUI

前端王者小分队读书会
4 stars 1 forks source link

《你不知道的JavaScript(中卷)》-promise的resolve特殊性-2021-03-15 #64

Open AwakenedSomeone opened 3 years ago

AwakenedSomeone commented 3 years ago

先看一个例子,猜猜会打印出啥:

var p3 = new Promise( function(resolve,reject){ 
  resolve( "B" ); 
 } ); 
 var p1 = new Promise( function(resolve,reject){ 
  resolve( p3 ); 
 } ); 
 p1.then( function(v){ 
  console.log( v ); 
 } )

结果打印出来的是“B”,第一次看到这样的写法,我以为p1的then中传的参数v应该是p3,因为p1在定义的时候就是将p3传给resolve的,实际上并不是表面上的那么简单,resolve不仅将参数传给了then方法中的回调函数,还在接收到参数之后做了处理,它会去判断resolve接收的参数是不是一个promise,或者是具有thenale(有和promise类似表现)的对象,则会去展开这个promise,即等待传入的promise的结果,然后将这个结果传给then里的回调函数。如果传入的promise有嵌套,则会取最终决议值或者状态。

再看补充的完整的例子:

var p3 = new Promise( function(resolve,reject){ 
  resolve( "B" ); 
 } ); 
 var p1 = new Promise( function(resolve,reject){ 
  resolve( p3 ); 
 } ); 
 p2 = new Promise( function(resolve,reject){ 
  resolve( "A" ); 
 } ); 
 p1.then( function(v){ 
  console.log( v ); 
 } )
 p2.then( function(v){ 
  console.log( v ); 
 } );

打印出来的结果 是先A后B,原因是,p1的resolve在展开p3的时候会是一个异步过程,所以p2的then先执行。