Promise中then的返回值

首先,then的返回值也是一个promise对象,所以它可以用链式语法,但是它的的返回值是一个与调用它的并不是同一个对象。

let p1 = new Promise(function(){})
let p2 = p1.then((resolve,reject)=>{})
console.log(p1 === p2)//false

以上的代码可以说明p1.then()的结果是与p1不用的一个promise对象。p2的状态和值由以下规则来确定:

1.如果p1的状态是pending,那么p2的状态也是pending。

2.如果p1的状态是resolved,then会去执行resolve(),那么p2的状态由resolve()的返回值决定。

  • 如果resolve()的返回值不是一个promise对象,那么p2的状态是resolved,且p2的值就是resolve()的return值。
  • 如果resolve()的返回值是一个promise对象,那么p2的状态以及值由这个promise对象为准。
  • 如果resolve()的返回值内部出现了错误(或者是用户抛出错误),那么p2的状态是rejected,且p2的值就是错误对象。

3.如果p1的状态是rejected,then会去执行reject(),那么p2的状态由reject()的返回值决定。

  • 如果reject()的返回值不是一个promise对象,那么p2的状态是resolved,且p2的值就是resolve()的return值。
  • 如果reject()的返回值是一个promise对象,那么p2的状态以及值由这个promise对象为准。
  • 如果resolve()的返回值内部出现了错误(或者是用户抛出错误),那么p2的状态是rejected,且p2的值就是错误对象。
let p1 = new Promise(()=>{});
let p2 = p1.then((resolve,reject)); // p2也是一个promise对象。
console.dir(p1); // pending
console.dir(p2); // pending
let p1 = new Promise((resolve,reject)=>{ resolve()});
let p2 = p1.then(resolve=>{return 1},reject=>{}); // p2也是一个promise对象。

console.dir(p1);	// resolved, undefined
console.dir(p2); // resolved, 1
let p1 = new Promise((resolve,reject)=>{ resolve()});
let p2 = p1.then(resolve=>{
	return new Promise((resolve,reject)=>{ resolve({a:1}) }); 
}, resject=>{}); 

console.dir(p2); // resolved, {a:1}
let p1 = new Promise((resolve,reject)=>{ resolve()});
let p2 = p1.then(resolve=>{
	console.log(abc);// 这里故意犯错
}, reject=>{}); 

console.dir(p2);//rejected  错误对象

 

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值