Promise是js中进行异步编程的解决方案
异步编程
-
fs 文件操作
require('fs').readFile('./index.html',(err,data) =>{})
-
数据库操作
-
AJAX
$.get('/server',(data)=>{})
-
定时器
setTimeout(()=>{},2000)
Promise 的状态
实例对象中的一个属性 PromiseState
- pending 未决定的
- resolved 成功
- rejected 失败
状态的改变只能从pending变为成功,或从pending变为失败;且只能改变一次,成功的结果一般称为value,失败的结果称为reason
Promise 对象的值
实例对象中的一个属性 PromiseResult
保存对象的【成功/失败】的值
- resolve
- rejcet
Promise构造函数:Promise(executor){}
- executor函数:执行器(resolve,reject)=>{}
- resolve函数:内部定义成功是调用回调函数value =>{}
- reject函数:内部定义失败时调用回调函数 reason =>{}
说明:executor会在Promise内部同步调用,异步操作在执行器中执行
Promise.prototype.then 方法:(onResolve,onReject) =>{}
- onResolve函数:成功的回调函数(value) =>{}
- onReject函数:失败的回调函数(reason) =>{}
说明:返回一个新的Promise()对象,用于指定成功回调value或失败回调reason
Promise.prototype.catch方法:(onReject) =>{}
- onReject函数:失败的回调函数(reason) =>{}
Promise.all方法:(promise)=>{}
- 包含几个Promise数组
说明:返回一个新的promise,只有所有的promise都成功才成功,且成功的结果为所有promsie成功返回的结果组成的数组;只要有一个失败就直接失败,返回的结果为失败的Promise值
Promise.race方法:(promise)=>{}
- 包含几个Promise数组
说明:返回一个新的promise,第一个完成Promise的【结果状态】就是最终的结果状态
改变Promise状态的方法
- 通过调用resolve函数 改变Promsie状态 pending–fulfilled
- 通过调用reject函数 改变Promsie状态 pending–rejected
- 通过throw 抛出异常 改变Promsie状态 pending–rejected
一个Promise()指定多个成功或失败的回调函数,都会调用嘛
- 当Promise改变为对应状态是时会调用指定的所有回调
改变Promise状态和指定回调函数谁先执行
当Promise内部是同步任务或给.then方法添加定时器时,先改变状态,再指定回调
当Promise内部是异步任务时(文件操作,数据库操作,定时任务,AJAX操作),先指定回调,再改变状态
Promise.then()返回的新的Promise的结果,状态由什么决定
由它指定的回调函数的返回值决定
Promise如何串联多个操作任务
Promise的.then()返回一个新的Promise,可以展开成.then()的链式调用
通过.then()链式调用串联多个同步/异步任务
Promise异常穿透
当使用Promise的then链式调用时,可以他通过catch在最后指定失败的回调
终断Promise链
返回一个pendding状态的Promise对象
因为then()回调会在状态改变的时候执行
34,35集 19,20代码
async函数
函数的返回结果是一个Promise对象
Promise对象的结果由async函数执行的返回值决定 跟then方法类似
await表达式
await右侧的表达式一般为Promise对象,但也可以是其他值
如果表达式是Promise对象,await返回的是promise成功的值
如果表达式是其他值,直接将此值作为await的返回值
注意:await必须写在async函数中,但async函数中可以没有await
如果await的promise失败了,就会抛出异常,需要通过try…catch捕获处理
axios
基于Promise操作方式的ajax封装包
直接用它来发送ajax,可以轻松拿到成功结果