promiseletp=newPromise(function(resolve,reject){console.log('createapromise')//resolve('success')}console.log立即执行('afternewpromise')p.then(function(value){console.log(value)})执行结果:'createapromise''afternewpromise''success'promise有三种状态:pending,completedstateresolved,failedstaterejectedvarp1=newPromise(function(resolve,reject){resolve(1);//同步代码,被立即调用,状态完成});varp2=newPromise(function(resolve,reject){setTimeout(function(){resolve(2);//异步代码,未执行,状态不完整},500);});varp3=newPromise(function(resolve,reject){setTimeout(function(){reject(3);//异步代码,未执行,状态未完成},500);});console.log(p1);console.log(p2);console.log(p3);setTimeout(function(){console.log(p2);//2、延迟执行,此时p2和p3已经被then()调用过,状态发生了变化},1000);setTimeout(function(){console.日志(p3);//3},1000);p1.then(函数(值){console.log(值);});//1p2.then(函数(值){console.log(值);});//2p3.catch(函数(错误){console.log(错误);});//3执行结果:Promise{1}Promise{}Promise{}123Promise{2}Promise{3}不可逆letp=newPromise(function(resolve,reject){resolve('success')resolve('success2')reject('reject')})p1.then(function(value){console.log(value)})executionResult:一旦'success'Promise的状态变为resolved或rejected,状态是固定的,后续调用resolve或reject方法不会改变现有的状态和值。链式调用letp=newPromise(function(resolve,reject){resolve(1)})p.then(function(value){console.log(value)//1返回值*2}).then(function(value){console.log(value)//2}).then(function(value){console.log(value)//undefinedreturnPromise.resolve('resolve')//returnpromiseinresolvedstate}).then(function(value){console.log(value)//'resolve'returnPromise.reject('reject')//在拒绝状态下返回promise}).then(function(value){console.log('resolve'+value)//接收成功状态值},function(err){console.log('reject'+err)//接收失败状态值rejectreject})执行结果:12undefined"resolve""reject:reject"then方法返回一个新的Promise对象,该函数的返回值为Promise返回的Promise对象中的异常varthenp1=newPromise(function(resolve,reject){foo.bar();resolve(1);});p1.then(function(value){console.log('p1thenvalue:'+value);},function(err){console.log('p1thenerr:'+err);//异常捕获}).then(function(value){console.log('p1thenthenvalue:'+value);//然后被正确的函数调用},function(err){console.log('p1thenthenerr:'+err);});varp2=newPromise(function(resolve,reject){resolve(2);});p2.then(function(value){console.log('p2thenvalue:'+value);//executefoo.bar();},function(err){console.log('p2然后err:'+err);}).then(function(value){console.log('p2thenthenvalue:'+value);},function(err){console.log('p2thenthenerr:'+err);//异常捕获return1;//返回1}).then(function(value){console.log('p2thenthenthenvalue:'+值);//被正确的函数调用后},function(err){console.log('p2thenthenerr:'+err);})执行结果:p1thenerr:ReferenceError:fooisnotdefinedp2thenvalue:2p1thenthenvalue:undefinedp2thenthenerr:ReferenceError:fooisnotdefinedp2thenthenvalue:1一旦异常被处理,后续的Promise对象then返回的会恢复正常,会被Promise回调函数处理成功执行另外需要注意的是,p1和p2多级then的回调函数是交替执行的,这是由异步的本质决定的承诺然后回调。resolvevarp1=Promise.resolve(1);varp2=Promise.resolve(p1);varp3=newPromise(function(resolve,reject){resolve(1);});varp4=newPromise(函数(resolve,拒绝){解决(p1);});console.log(p1===p2);console.log(p1===p3);console.log(p1===p4);console.log(p3===p4);p4.then(函数(值){console.log('p4='+值);});p2.then(函数(值){console.log('p2='+值);})p1.then(函数(值){console.log('p1='+值);})控制台输出:truefalsefalsefalsep2=1p1=1p4=1Promise.resolve(...)可以接收一个值或一个Promise对象作为参数。当参数为普通值时,返回一个已解析状态的Promise对象,该对象的值就是参数;当参数是Promise对象时,直接返回Promise参数。因此,p1===p2。但是new创建的Promise对象都是new对象,所以下面三个比较的结果都是false。另外,为什么先调用p4的then,在控制台却是最后输出的结果?因为在p4的resolve中接收到的参数是一个Promise对象p1,resolve会对p1进行“拆箱”,获取p1的状态和值,但是这个过程是异步的。开箱的概念应该是微任务和宏任务吧???