什么是Promise?
含以上:抽象异步操作的工具。
javascript中:Promise就是一个构造函数(函数也是对象)
为什么需要Promise?
1.多个嵌套的异步操作,如果直接用callback方式,会导致callback hell
2.Promise的出现使得异步操作更加规范,API更加统一。
3.多个异步操作之间较复杂的关系可以简单通过Promise处理。
Promise的三种状态
fulfilled:满足,成功
rejected:拒绝,失败
pending:初始状态
注:settled是指fulfilled,rejected状态之一。
Promise的方法:
Promise()构造函数
Promise(
//executor
function( resolve,reject){
}
);
构造函数用于生成Promise对象,executor函数在Promise构造函数执行时同步执行。
resolve,reject函数被调用时分别将Promise状态设置为fulfilled,rejected
new Promise( (resolve, reject)=>{
resolve( 'resolved value' );
});
new Promise( (resolve, reject)=>{
reject( 'rejected value' );
});
Promise.resolve, Promise.reject
Promise还提供了全局的静态方法用于快速生成Promise对象。
Promise.resolve生成fulfilled状态的Promise
Promise.reject生成rejected状态的Promise
Promise.resolve( 'resolved value' );
Promise.reject( 'rejected value' );
Promise实例方法:then( onfulfilled, onrejected ), catch( onrejected )
then和catch用于处理Promise fullfilled成功或者rejected失败时候的情况。
更加推荐的做法:
myPromise.then(onfulfilled).catch(onrejected);
这样的好处:
1.then,catch区分开,分别处理成功,失败,代码更容易理解。
2.then().then().then().catch(); then,catch方式可以捕获到前面多个then中的异常。
Promise可以链式调用的原因?
因为Promise.prototype.then方法和Promise.prototype.catch方法都返回Promise对象。所以可以链式调用:
myPromise.then(xxx).then(xxx);
Promise.prototype.then(onfulfilled, onrejected)当中,then返回的Promise和onfulfilled,onrejected的返回值有什么联系?
onfulfilled,onrejected的返回值 | then,catch的返回值 |
---|---|
值(常用) fulfilled Promise | fulfilled Promise |
throw Error异常 rejected Promise | rejected Promise |
pending Promise | pending Promise |
多个Promise关联操作
假设有A/B/C三个Promise
1.A执行完才能执行B,B执行完才能执行C
典型的顺序执行关系,直接使用链式操作:
A.then(()=>{return B})
.then(()=>{return C});
2.A/B执行成功了才能执行C
Promise.all([A,B]).then(
()=>{
return C;
}
);
3.ABC中任意一个settled即可:
Promise([A,B,C]).then(xxx).catch(xxx);
注意:第一个Promise settled之后,不会取消剩余的Promise对象的执行。
额外知识:
1.Promise.resolve方法除了快速创建Promise以外,还能够将thenable(有.then方法的对象)对象转换为Promise。 典型的$.ajax()就会返回thenable对象。
2.then(onfulfilled, onrejected)中的onfulfilled,onrejected方法是异步调用的即时在调用Promise.prototype.then注册Promise时,Promise已经setteled,这2个函数也不会马上同步执行。Promise会以异步方式调用该回调函数,这个Promise设计上的规定方针。
3.如果如果没有注册onrejected函数,那么异常会抛出,只是捕获不了。
4.尽量不要使用非链式操作Promise对象, 非链式操作情况下异常不会被捕获,也不能得到then的返回值(即时then有返回值的情况)
5.使用reject而不是throw来触发Promise失败,因为throw的话很难区分是主动抛出的rejected还是程序执行出错。