如何修改promise的状态?
promise原状态是pending(未决定的),在执行器中调用resolve(),状态会变为成功,调用reject(),会变为失败。除此之外,我们还可以通过throw语句,将状态改为失败。
let p1=new Promise((resolve,reject)=>{
throw '出错啦'
})
promise能否执行多个回调?
也就是,then方法如果指定多个回调,这些回调是不是都会执行?答案是肯定的。
let pp=new Promise((resolve,reject)=>{
resolve('ok');
})
// 回调1
pp.then(value=>{
console.log(value)
})
// 回调2
pp.then(value=>{
alert(value)
})
console.log(pp)
只要promise的状态发生改变,回调函数就会执行。
改变状态与指定回调的顺序
因为promise是用来处理异步任务的,所以正常情况下是先指定回调再改变状态,但也可以先改变状态再指定回调。如果执行器中的任务是同步执行的,就会先改变状态,再指定回调。
如何先改变状态再指定回调?
(1)在执行器中直接调用resolve()或者reject()。
(2)延迟更长时间才调用then。
什么时候执行的回调?
指定回调与执行回调不是一个概念,指定回调相当于声明了then方法,执行回调才是执行then里边的函数。
执行回调的时机与改变状态、指定回调二者的顺序有关。只有两种可能:
改变状态->指定回调->执行回调;
指定回调->改变状态->执行回调。
then方法返回结果由什么决定?
由指定函数的执行结果决定。
如何串联多个任务?
let p=new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('ok');
},1000)
});
p.then(value=>{
return new Promise((resolve,reject)=>{
resolve('success');
})
}).then(value=>{
console.log(value)//success
})
第一个then的返回结果是一个成功的promise,接着.then,那么执行结果由该promise的执行结果决定,也就是success。
p.then(value=>{
return new Promise((resolve,reject)=>{
resolve('success');
})
}).then(value=>{
console.log(value)
}).then(value=>{
console.log(value)
})
上述代码的执行结果是undefined,因为第三次.then,它的执行结果应该是上一个then返回的promise的执行结果的返回值,但是我们没有给返回值,所以value是undefined。第二个then的返回结果是一个成功的promise,且成功的结果是undefined,所以第三个会打印出undefined。
promise的异常穿透
let p=new Promise((resolve,reject)=>{
setTimeout(()=>{
// resolve('ok');
reject('失败了')
},1000)
});
p.then(value=>{
return new Promise((resolve,reject)=>{
resolve('success');
})
}).then(value=>{
console.log(value)
}).then(value=>{
console.log(value)
}).catch(reason=>{
console.log(reason)//失败了
})
处理异常只需要在最后写一次catch即可,前边的then都不会执行。
如何中断promise链
前边说,因为then的返回结果是一个promise,所以可以一直调用.then,这就是promise链。
中断promise链的方法只有一个,就是让then返回一个pending状态的promise,因为promise的状态没有改变,then方法就没办法执行。
p.then(value=>{
return new Promise((resolve,reject)=>{})
}).then(value=>{
console.log(value)
}).then(value=>{
console.log(value)
})
第一个then返回的是pending状态的promise(因为没有调用resolve或reject),后边的.then不会被执行,也不会输出任何结果。