含以上:抽象异步操做的工具。
javascript中:Promise就是一个构造函数(函数也是对象)javascript
1.多个嵌套的异步操做,若是直接用callback方式,会致使callback hell
2.Promise的出现使得异步操做更加规范,API更加统一。
3.多个异步操做之间较复杂的关系能够简单经过Promise处理。java
fulfilled:知足,成功
rejected:拒绝,失败
pending:初始状态
注:settled是指fulfilled,rejected状态之一。ajax
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还提供了全局的静态方法用于快速生成Promise对象。
Promise.resolve生成fulfilled状态的Promise
Promise.reject生成rejected状态的Promise函数
Promise.resolve( 'resolved value' ); Promise.reject( 'rejected value' );
then和catch用于处理Promise fullfilled成功或者rejected失败时候的状况。
更加推荐的作法:
myPromise.then(onfulfilled).catch(onrejected);
这样的好处:
1.then,catch区分开,分别处理成功,失败,代码更容易理解。
2.then().then().then().catch(); then,catch方式能够捕获到前面多个then中的异常。工具
由于Promise.prototype.then方法和Promise.prototype.catch方法都返回Promise对象。因此能够链式调用:prototype
myPromise.then(xxx).then(xxx);
onfulfilled,onrejected的返回值 | then,catch的返回值 |
---|---|
值(经常使用) fulfilled Promise |
fulfilled Promise |
throw Error异常 rejected Promise |
rejected Promise |
pending Promise | pending Promise |
假设有A/B/C三个Promise
1.A执行完才能执行B,B执行完才能执行C
典型的顺序执行关系,直接使用链式操做:设计
A.then(()=>{return B}) .then(()=>{return C});
2.A/B执行成功了才能执行Ccode
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仍是程序执行出错。