Promise的理解

什么是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 Promisepending 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还是程序执行出错。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值