异步
- 异步任务:定时器、DOM事件、ajax请求、图片视频等资源的加载
- 异步解决方案:事件回调函数、promise
1. 概念
- promise是一个异步事件的容器,一旦新建立即执行,中途无法中断
- 有三种状态(进行中pending、成功fulfilled/resolved、失败rejected)
- 状态不收外界影响,只有异步操作的结果可以影响
- 状态一旦改变就会一直保持不变,任何时候都可以得到该结果,不像事件,只有发生时可以监听到,否则会错过
- 是一个构造函数,接收一个函数为参数,该函数有两个参数,分别为resolve、reject,均为函数
- resolve函数作用:当异步操作成功时调用,将状态为成功,并传递异步执行结果
- reject函数作用:当异步操作失败时调用,将状态为失败,并传递异步错误信息
- resolve和reject在本轮事件循环的末尾执行,一般放在函数最后,return resolve(res),因为return后面的代码不会执行
- promise的作用:把回调函数拆出去,通过状态判断异步执行结果,通过resolve和reject传递执行结果,通过then、catch等方法处理返回的结果
2. 工作流程
- promise是一个保存异步操作的容器
- 新建一个promise后,会立即执行
- 当异步操作成功时,调用resolve方法,将状态由进行中变为成功,并把异步成功后返回的结果作为参数传给then方法的第一个回调函数
- 当异步操作失败时,调用reject方法,将状态由进行中变为失败,并把异步失败时抛出的错误作为参数传给catch方法的回调函数,或者传给then方法的第二个回调函数
- 一般都是用catch方法,不写then的第二个回调函数参数
3. 方法
- then:Promise.prototype.then,为promise添加状态改变时的回调函数,一般是添加成功时的
- then方法返回一个新的promise对象,所以可以链式调用
- 链式的then方法,可以指定一组按照次序调用的回调函数
- 链式then中,第一个函数调用完,会将返回结果作为参数传递给第二个回调函数
- then方法会在当前脚本文件(如.js文件)的所有同步任务执行完成后才执行
- 接收两个函数为参数,第一个在promise状态为成功时调用,第二个在promise状态为失败时调用,这两个函数都接收resolve和reject传递过来的参数(异步返回的结果)
- catch:Promise.prototype.catch,为promise添加发生错误时的回调函数
- catch方法返回一个新的promise对象,所以可以链式调用
- 捕获的错误包括:异步的错误、then方法中指定的回调函数的错误
- resolve后面的错误不会被捕获,因为promise状态一旦改变就保持不变了
- 错误会一致向后传递,指导被捕获为止
- 如果没有错误,则跳过catch
- 接收一个函数为参数,接收reject传递过来的参数(报错)
- all:Promise.all,将多个promise实例包装成一个promise实例
- 接收一个promise实例的数组
- 当数组中的每一个promise都返回成功时,新promise实例的状态才是成功,返回结果为所有实例返回加过组成的数组
- 数组中的每个promise实例,只要有一个返回失败,新promise实例的状态就为失败,返回结果为第一个失败的promise实例的返回值
- race:Promise.race,和all类似
- 只要有一个promise实例状态先改变,新promise实例的状态就跟着改变,返回结果就是这个最先改变的promise实例的返回值