promise
a.then返回的是新的promise,第一个参数是resolved状态的回调函数,第二个参数是rejected状态的回调函数。
b.catch返回的也是新的promise,如果异步发生错误变成rejected状态,就会调用catch。注意:如果前面的then已经对reject做处理(then的第二个参数做了处理)了,catch就不会再处理【就近原则】
举个例子:
new Promise((resolved, rejected) => { throw new Error('promise error'); rejected(); }).then(() => { console.log('then resolved') }, (error) => { console.log('then rejected'); console.log(error); }).catch((error) => { console.log('catch rejected');
console.log(error); }) // then rejected // Error: promise error
//由此可见,then对rejected做了处理后,catch将不再处理
但是,then的回调函数中出现的错误也会被catch捕获,如下:
new Promise((resolved, rejected) => { throw new Error('promise error'); rejected(); }).then(() => { console.log('then resolved') }, (error) => { console.log('then rejected'); console.log(error); throw new Error('rejected then error'); }).catch((error) => { console.log('catch rejected'); console.log(error); }) // then rejected // Error: promise error // catch rejected // Error: rejected then error
const p = Promise.all([p1, p2]);
p1 resolved,p2 rejected
如果p2有catch了,就不会走到p的catch因为:p2
有自己的catch
方法,该方法返回的是一个新的 Promise 实例,p2
指向的实际上是这个实例。
该实例执行完
catch
方法后,也会变成resolved
,导致Promise.all()
方法参数里面的两个实例都会resolved
,
因此会调用
then
方法指定的回调函数,而不会调用catch
方法指定的回调函数。
catch相当于then(null,rejected)
c.如何终止一个promise
用promise.race();
const p = Promise.race([p1,p2])
p1,p2中只要有一个率先改变状态,p的状态就会改变 即p1和p2只要有一个搞完了,p就搞完了
且,率先改变的promise实例的返回值就是P的值,即如果P2搞完了,p的值就是P2这个实例的返回值
利用这个特性可以实现,在规定时间内未获得结果,直接将promise变为reject,否则就resolved
const p = Promise.race([new Promise((resolved, rejected) => { }), new Promise((resolved, rejected) => { setTimeout(() => { rejected(new Error('你超时了乖乖')) }, 5000) })]); p.then((res) => { console.log(res) }).catch((err) => { console.log(err) }); // 5s后打印出Error:你超时了乖乖
const p = Promise.race([new Promise((resolved, rejected) => { resolved('我率先完成了'); }), new Promise((resolved, rejected) => { setTimeout(() => { rejected(new Error('你超时了乖乖')) }, 5000) })]); p.then((res) => { console.log(res) }).catch((err) => { console.log(err) }); // 我率先完成了
如此便实现了终止一个promise
哈哈哈,突然间想到了另外一种终止promise的方法。用rejected状态。
const p = new Promise((resolved, rejected) => {
// 这里是想终止的promise,比如说,这里在请求一个接口,5秒内200了就让p resolved();超时了的话,下面的rejected()也就执行了,这个promise也就终止了 setTimeout(() => { rejected('error'); }, 5000) }).then((res) => { console.log(res); }).catch((err) => { console.log(err); });
两种方法是一个思路,规定时间内你没完成,我就代替你完成,你便失去了执行的意义,也就”终止“了