Promise async/await
定义:ES6引入的异步编程的构造函数(新),封装异步任务,好处是支持链式调用,解决回调地狱(旧方案,回调函数且套调用)的问题。
promise对象用来封装一个异步操作并可以获取成功或失败的结果
旧的:必须在异步任务之前结束指定;新的:启动异步,返回promise对象,给promise对象绑定回调函数,甚至可以在异步结束后;
异步编程包括
fs 文件操作(node.js) | 数据库操作 | ajax | 定时 |
---|
AJAX请求,四步操作
创建对象 const xhr = new XMLHttpRequest();
初始化 xhr.open(‘请求类型’,’接口地址’)
发送 xhr.send()
绑定事件,处理响应结果
xhr.onreadystatechange = function(){}
Promise 状态
是实例对象中的一个属性 PromiseState
- pending
- resolved / fulfilled(成功)
- rejected(失败)
Promise 对象的值
实例对象中的一个属性 PromiseResult
- 异步 成功/失败的结果
- resolve,reject函数可以修改值
Promise 的 API
const p = new Promise((resolve,reject) =>{})
Promise内部是同步调用,封装异步操作,then方法是异步
Promise.resolve Promise.reject
- 返回的都是promise对象
<script> |
Promise.all
const result = Promise.all([p1,p2,p3])
- 返回promise对象,接受一个参数,由 promise 组成的数组(promise套promise),只有所有的promise 成功才成功,返回结果是成功的 promise 组成的数组;失败的结果是失败的 promise 结果组成的数组。
Promise.race
- 返回promise对象,接受一个参数,由 promise 组成的数组,最终结果由第一个完成的 promise 结果状态
关键问题
- 修改对象状态
- 还可以抛出一个错误
throw '出问题了’
- 执行多个回调
- 也就是 promise 对象调用 then 方法时,当 promise 状态发生改变时,有多个成功/失败回调函数,都会被调用
- Promise内部操作(1)与指定回调函数(2 不是执行回调函数)的顺序
- Promise内部是同步操作时,先1后2,然后执行回调函数
- Promise内部是异步操作时,先指定回调函数,然后执行异步操作,然后执行回调函数,输出结果
- then方法返回结果由什么决定
- then方法返回的是一个 promise 对象
- 由then方法内部的回调函数的结果决定的
- promise 如何串联多个操作任务
- 通过 then 的链式调用
- 如何中断 promise 链
- 只有一个方法:then方法中返回一个 pedding 状态的Promise 才能中断。
async
- 函数返回值为promise对象
- 对象结果是由 async 函数执行的返回值决定的。
await
- await 右侧的表达式一般为promise 对象
- 若表达式为promise 对象,await返回的是成功的值
- 若表达式为其他值,直接将此值返回
注意:- await 必须写在async函数中,但async函数中可以没有await
- 若 await 的 promise 失败了,就会抛出异常,需要try catch捕获处理 |