js 异步我的理解是 js 线程遇到异步任务不会一步一步的按照顺序去执行,而是继续往下执行,等异步任务完成后再通知 js 线程去处理,常见的异步方案有异步回调、Promise、生成器 Generator、async/await
异步回调的方式回调控制权在第三方,且多层嵌套会产生回调地狱问题,后面出现了 Promise 解决方案,回调控制权通过 promise 对象的 resolve 和 reject 控制,通过链式调用.then 方法避免了回调地狱问题,后面出现的生成器函数也是一种解决方案,可以 yield 关键字和.next () 方案来控制函数的执行,最后出现了 async 和 await 语法(结合了 promise(成功后继续递归调用生成器) 和生成器函数(同步写法)的优点),让异步代码写起来更像同步的代码,可读性更高。
A + 规范规定:
promise
对象仅有三种状态
pending
(进行中)Settled
(已决)fulfilled
(已成功)rejected
(已失败)
Settled(已决):
Promise
已经完成,不再是 pending 状态,可以是 fulfilled 或 rejected 之一。所有的异步任务都可以看作是一个异步的对象 Promise,每个任务都有两个阶段(已决,未决 )和三种状态(pending,resolve,reject),状态只能由 pending 到 resolve 或 reject,不可逆且改变后状态不可变(模仿现实,时间不能倒流)
任务状态改变后,成功会有一个不可变的终值,失败会有一个不可变的原因,后续可以通过被 promise.then 方法 (链式 then 是同步调用,状态决定才执行回调) 处理
then 方法接受 onFulfilled,onRejected 函数作为可选参数,若参数不是函数,则忽略
then 方法必定会返回一个新的 Promise(可理解为后续处理也是一个任务)
新任务的状态取决于后续处理:
若没有相关的后续处理,新任务的状态和前任务一致,数据为前任务的数据
若有后续处理但还未执行,新任务挂起。
若后续处理执行了,则根据后续处理的情况确定新任务的状态
- 后续处理执行无错,新任务的状态为完成,数据为后续处理的返回值(即使后续处理出现在 reject 的回调里)
- 后续处理执行有错,新任务的状态为失败,数据为异常对象
- 后续执行后返回的是一个任务对象(promise),新任务的状态和数据与该任务对象一致
Promise
构建出来的实例存在以下方法:
- then()
- catch()
- finally()
Promise
构造函数存在以下方法:
- all () 用于将多个
Promise
实例,包装成一个新的Promise
实例 - race () 同样是将多个 Promise 实例,包装成一个新的 Promise 实例
- allSettled () 方法接受一组 Promise 实例作为参数,包装成一个新的 Promise 实例 只有等到所有这些参数实例都返回结果,不管是
fulfilled
还是rejected
,包装实例才会结束 - resolve () 将现有对象转为
Promise
对象 - reject () 方法也会返回一个新的 Promise 实例,该实例的状态为
rejected
- try()