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); });

两种方法是一个思路,规定时间内你没完成,我就代替你完成,你便失去了执行的意义,也就”终止“了

posted @ 2021-12-22 18:48  superil  阅读(38)  评论(0编辑  收藏  举报