首先,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 错误对象