可以用来指定回调,接下来看then()方法的返回结果:
const p = new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(‘用户数据’);
},1000);
});
const result = p.then(value => {
console.log(value);
},
reason =>{
console.log(reason);
});
console.log(result);
//result的返回结果依旧是Promis格式,但是它成功与否的状态,是看result接收到的是成功的,还是失败的回调函数。
p.then()方法返回的结果是promise对象,但是这个对象的状态,是由以下因素决定:
1.如果p里面的异步任务,调用的是resolve,则p.then()方法打印的结果(promise对象)的状态为resolve而且结果为p里面状态的结果
如果p里面的异步任务,调用的是reject,则p.then()方法打印的结果(promise对象)的状态为reject而且状态的结果为p里面状态的结果。
需要特别注意的是:情况1仅限于p.then()括号中不会执行任何的时候
2.如果p.then()回调函数中return返回的结果是一个非promise对象,那么p.then()打印的结果是(promise对象)的状态为resolve.且return返回值为p.then()中return的返回值。
const result = p.then(value => {
console.log(value);
return ‘zzzzzzz’;
},
reason =>{
console.log(reason);
});
console.log(result);
3.如果p.then()回调函数中不使用return,那么我们知道,函数不写return时,返回值为underfined,这也是一个非promise对象。
4.如果p.then()回调偶函数中return 返回的结果是,一个promise对象,那么p.then()中return返回的promise的状态就是p.then()方法打印的promise对象的状态。而且内部这个promise返回成功的值,就是p.then()方法返回promise对象的值。
const p = new Promise(function(resolve,reject){
resolve(‘返回的是成功的状态’)
})
const result = p.then(value => {
return new Promise(function(resolve,reject) {
resolve(‘内部promise对象的成功值’)
})
},
reason =>{
});
console.log(result);
then()方法的链式调用:
const p = new Promise(function(resolve,reject){
resolve(‘返回的是成功的状态’)
})
const result = p.then(value => {
return new Promise(function(resolve,reject) {
resolve(‘内部promise对象的成功值’)
})
});
result.then(value =>{
console.log(‘打印这段话’);
})
Promise在进行链式调用的时候,出现的异常穿透现象:
我们不需要在每次链式调用的后面后为其准备失败的回调,只需要在最后一次失败的时候,使用catch()方法进行失败回调即可:如下图所示
如何中断Promise的链式调用:
核心思路是:
在摸一次调用then()方法时,在其内部的回调函数中返回一个处于准备状态的Promise实例,这样由于该次的then()返回的Promise对象的状态为准备,后续为其指定的回调函数就不能执行,就实现了中断