异步编程
- fs文件操作
- 数据库操作
- AJAX
- 定时器
旧方案单纯回调函数形式处理
为什么要用Promise
- 支持链式调用,解决回调地狱问题
- 指定回调函数的方式更加灵活
- 旧的:必须在启动异步任务前指定
- promise: 启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束之后指定/多个)
针对跨域
http-proxy-middleware在客户端配置
cors在服务端配置
Promise的状态
实例对象中的一个属性 【PromiseState】
- pending 未决定的
- resolved/fullfilled 成功
- rejected 失败
- Promise状态改变:只有两种,且一个promise对象只能改变一次
Promise对象的值
实例对象的另一个属性 【PromiseResult】
保存的是异步任务【成功/失败】的结果
API
1 | Promise.prototype.then((value)=>{},(reason)=>{}) |
几个关键问题
- 如何改变promise的状态
- resolve(value)
- reject(reason)
- throw Error抛出异常
- 一个promise指定多个成功/失败回调函数,则都会调用
1
2
3
4
5const p = new Promise((resolve,rejected)=>{
resolve('ok')
})
p.then(value=>console.log(value))
p.then(value=>alert(value)) - 改变promise状态和指定回调函数谁先谁后?
- promise.then()返回的新promise的结果状态由什么决定?
—由then()指定的回调函数执行的结果决定
5. promise如何串联多个操作任务
—通过then的链式调用串联多个同步/异步任务
6. promise异常穿透
7. 中断promise链
方法:在回调函数中返回一个pending状态的promise对象(状态没有改变,后续.then方法都不能执行)
手写Promise
async与await
- async函数的返回值为promise对象,对象结果由async函数执行的返回值决定(和.then()的返回结果相同)
- await右侧的表达式如果是promise对象,则await返回的是promise成功的值,如果表达式是其他值,直接将此值作为await的返回值
- await必须写在async函数中,但async函数可以没有await;如果await的promise失败了,就会抛出异常,需要通过try…catch捕获处理