聊聊 Promise

作者 : 开心源码 本文共1794个字,预计阅读时间需要5分钟 发布时间: 2022-05-13 共160人阅读

Promise相信写前台的同学都不陌生,本意是承诺,答应完成某事。promise主要用于异步计算。可以将异步操作队列化,按照期望的顺序执行,返回符合预期的结果。还可以在对象之间传递和操作promise,帮助我们解决队列。
和其余异步调用的优点在于:

  1. promise是一个对象,对象和函数的区别就是对象可以保存状态,函数不可以(闭包除外)。
  2. 并未剥夺函数return的能力,因而无需层层传递callback,进行回调获取数据。
  3. 代码风格,容易了解,便于维护。
  4. 多个异步等待合并便于处理。
    promise有三个状态:
    1、pending[待定]初始状态
    2、fulfilled[实现]操作成功
    3、rejected[被否决]操作失败

当promise状态发生改变,就会触发then()里的响应函数解决后续步骤;
promise状态一经改变,不会再变。
Promise对象的状态改变,只有两种可能:

  • 从pending变为fulfilled
  • 从pending变为rejected。

这两种情况只需发生,状态就凝固了,不会再变了。
所以我们可以生成这样的链式调用 new Promise().then().then().catch()
我们来看下Promise可以怎样解决异常:
第一种catch+then

//catch+thennew Promise(resolve => {      throw new Error('this is a error')  }).catch(err=>{      console.error('catch+then: I catch',err)  }).then(res=>{      console.log('222')  }).catch(err=>{      console.error('catch+then: I catch2',err)  })

image.png

可以看出catch返回的Promise的状态也是resolved,可以继续执行then。
第二种 then

  //then  new Promise(()=>{      console.log('start...')      throw new Error('this is a error')  }).catch(err=>{      console.error('i catch:', err)    throw new Error('this is another error')  }).then(()=>{      console.log('test')  }).then(()=>{      console.log('test2')  }).catch(err=>{      console.error('I also catch ',err)  })

image.png

可以看出抛出错误变为rejected状态,所以绕过两个then直接跑到最下面的catch。
Promise.all(p1,p2…),等待p1,p2 都完成了返回。
Promise.race(p1,p2,..),只需有一个完成,就返回。
可用于异步操作和定时器放在一起,假如定时器先触发,就认为超时,告知客户;
接下来,我们来挑战下Promise经典的四道题:

1. doSomething().then(function () {  return doSomethingElse();});2. doSomething().then(function () {  doSomethingElse();}).then(final);3. doSomething().then(doSomethingElse()).then(final);4. doSomething().then(doSomethingElse);

第一个:先执行doSomething(),而后再执行doSomethingElse(),而后再往下执行。
第二个:没有return,所以函数体中不返回新的promise实例,所以是两个队列,在doSomething执行完后,final和doSomethingElse同时执行。
第三个:函数体中是doSomethingElse(),是一个可执行的promise实例,可以和doSomething一起执行,而后它的结束状态不论,final函数会在doSomething结束后执行。
第四个:跟平常见到的一样,resolve和reject,按顺序执行。
综上,Promise感觉和java中的builder构造器一样,又有点像适配器模式那样,将复杂的请求分而治之,无疑是前台开发的一大利器。

说明
1. 本站所有资源来源于用户上传和网络,如有侵权请邮件联系站长!
2. 分享目的仅供大家学习和交流,您必须在下载后24小时内删除!
3. 不得使用于非法商业用途,不得违反国家法律。否则后果自负!
4. 本站提供的源码、模板、插件等等其他资源,都不包含技术服务请大家谅解!
5. 如有链接无法下载、失效或广告,请联系管理员处理!
6. 本站资源售价只是摆设,本站源码仅提供给会员学习使用!
7. 如遇到加密压缩包,请使用360解压,如遇到无法解压的请联系管理员
开心源码网 » 聊聊 Promise

发表回复