网络请求promise、await相关理解

109 阅读5分钟
  • ()左边是函数,.左边是对象。

  • 实例对象可以简称对象。

  • 函数对象是指定义的函数用作对象访问方法或者属性时,不可简称为 对象。

  • 注意实例对象的方法

  • 函数对象的方法

  • 函数对象原型上的 方法。

  • 回调函数特点:

  • 自己定义。

  • 不自己调用。

  • 最终会被调用。

  • 同步回调:不会放入队列,直接调用。

  • 异步回调:放入队列,将来执行。

  • 内置错误:

  •   ReferenceError 引用错误
      
    
  •   TypeError:类型错误。
    
  •   RangeError 数据值不在允许范围内 
    
  •   SytanxError 语法错误 
    
  • 错误处理:

  • try-catch捕获。error有两个访问属性:message 和stack,可以让程序继续执行后面的内容。

  • throw error:自己抛出自定义异常。

  • promise:

  • 定义:

  • JS中异步编程的新的解决方案(纯回调形式是旧的解决方案)。

  • 优势为可以指定回调函数的方式更灵活。可以在异步任务完成后调用都不会有问题,只是此时如果返回结果是失败的话,可能会发出没有绑定onRejected处理函数的警告。

  • 纯回调形式必须在启动异步任务之前指定回调函数。

  • 具体来说,promise是一个构造函数,promise对象用来封装一个异步操作,并得到结果进行处理。

  • 状态改变:

  • pending到resolved。

  • pending到rejected。

  • 成功的数据叫value,失败的结果是reason。

  • 使用流程:创建promise实例对象,调用异步函数,成功走resolve通道,失败走reject通过;成功变为resolved状态,失败变为rejected状态;成功通过then调用回调函数(onResolved),失败通过then或者catch调用回调函数(onRejected)。

  • promise里面的参数称为执行器函数,是一个同步回调函数。会立即执行。只有异步回调才会被放到队列里面。

  • 回调地狱问题:

  • 使用纯回调函数进行回调函数嵌套,多个异步函数的串联使用,前一个异步任务开启由上一个异步任务的结果来决定,造成阅读不方便,代码编写难度大,难以控制异常结果的问题。

  • promise链式调用会解决这个问题,它的异步函数不是嵌套的,并且有异常穿透功能。

  • async/await是解决回调地狱的终极方案。

  • excutor为执行器函数,是同步回调函数。

  • then、catch方法是Promise函数对象原型上的方法。返回一个新Promise对象。

  • resolve(成功值为某值的语法糖)、reject、all、race函数对象的方法。

  • 实际使用的时候,可以改名字,是形参。

  • all是有成功都会返回,结果组成一个数组返回。只要有一个失败就返回失败的值,哪个先失败返回哪个。

  • race是哪个第一个返回就返回哪个。(大家都没延时的时候就看排列顺序,有延时的时候按照延时时间,看谁先完成)

  • 除了成功和失败状态,还可以有抛出异常状态,抛出异常也是让promise进入rejected状态。

  • 如果指定了多个回调函数,改变为相应状态时,都会调用。

  • 状态改变和调用异步回调函数的顺序是可以自己控制的。通过给予相关的延时控制。

  • then()返回的Promise的状态由前一个执行回调函数的结果决定。

  • 抛出异常。新Promise就会变为rejected状态。

  • 返回一个promise,由这个promise结果决定 。

  • 非promise值,新promise都会变为resolved状态。

  • 新promise默认为resolved状态。

  • promise的链式调用可以串联同步任务和异步任务(包装在promise里面)调用。

  • 链式调用时,如果发生错误 ,中奖而没有写错误回调函数,那么会自动调用throw reason把错误透传到最后的错误回调函数。

  • 中断promise链,直接return一个new Promise(){},一个处于pending状态的promise。

  • 自定义promise。

  • async和await:asyncawait关键字让我们可以用一种更简洁的方式写出基于Promise的异步行为,而无需刻意地链式调用promise。相当于写法上更简洁了。

  • async函数:

  • 返回promise对象。

  • promise对象结果由async函数的返回值决定。

  • await表达式:

  • 右侧的表达式一般为promise对象。

  • 如果是promise对象,返回值是promise成功的值。

  • 如果不是promise,那么就是返回值本身。

  • await在 async函数里面,如果接收到了异常,那么会直接抛出异常,不会继续执行其他的语句了 。要想执行下面的语句只能用try catch来捕获。

  • await必须使用在async里面。

  • 宏队列和微队列:

  • 宏队列:

  • dom事件回调。

  • ajax回调。

  • 定时器回调。

  • 微队列:

  • promise回调。

  • mutation回调(监听标签属性的改变)。

  • JS事件循环机制执行顺序:同步任务首先被执行,期间添加宏任务和微任务,接着优先执行微任务,再执行宏任务。

  • 面试相关总结:

  • then()里面回调函数不标注的话,默认是成功的回调函数。

  • 记得一个promise的状态只能改变一次,后面改变就无效了。

  • 记得连续两个then,如果没有第一个then没有立即返回,那么第二个then会执行,但是不会加入微任务,需等待第一个then执行了才会加入微任务。