0%

promise

异步编程

  • fs文件操作
  • 数据库操作
  • AJAX
  • 定时器
    旧方案单纯回调函数形式处理

为什么要用Promise

  • 支持链式调用,解决回调地狱问题
  • 指定回调函数的方式更加灵活
    • 旧的:必须在启动异步任务前指定
    • promise: 启动异步任务 => 返回promise对象 => 给promise对象绑定回调函数(甚至可以在异步任务结束之后指定/多个)

针对跨域
http-proxy-middleware在客户端配置
cors在服务端配置

Promise的状态

实例对象中的一个属性 【PromiseState】

  • pending 未决定的
  • resolved/fullfilled 成功
  • rejected 失败
  • Promise状态改变:只有两种,且一个promise对象只能改变一次

Promise对象的值

实例对象的另一个属性 【PromiseResult】
保存的是异步任务【成功/失败】的结果

API

1
2
3
4
5
6
7
8
Promise.prototype.then((value)=>{},(reason)=>{})
Promise.prototype.catch((reason)=>{})//是上面第二个函数对应的语法糖
Promise.resolve();
//如果传入的参数为非promise类型的对象,则返回结果为成功promise对象
//如果传入参数是pr omise对象,则参数的结果决定了resolve的结果
Promise.reject(reason);//返回一个失败的promise对象,值是传入的值(即使他是一个promise)
Promise.all(promises) //参数:n个promise的数组 返回一个新的promise(只有所有的promise都成功才成功,只要一个失败则直接失败,成功结果是每个promise成功结果组成的一个数组,失败结果是数组中失败的那个promise对应的结果)
Promise.race(promises) //参数:n个promise的数组 返回一个新的promise(第一个完成的promise的结果状态就是最终的结果状态)

几个关键问题

  1. 如何改变promise的状态
  • resolve(value)
  • reject(reason)
  • throw Error抛出异常
  1. 一个promise指定多个成功/失败回调函数,则都会调用
    1
    2
    3
    4
    5
    const p = new Promise((resolve,rejected)=>{
    resolve('ok')
    })
    p.then(value=>console.log(value))
    p.then(value=>alert(value))
  2. 改变promise状态和指定回调函数谁先谁后?
  3. 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捕获处理