async

why async

传统callback方式

Promise

  • 解决问题

    • 多层嵌套的问题

    • 每种任务的处理结果存在两种可能性(fulfilled or rejected, default is pending),那么需要在每种任务执行结束后分别处理这两种可能性

  • 如何解决

    • 回调函数延迟绑定

    • 返回值穿透

    • 错误冒泡

  • 缺点

    1. 无法取消Promise,一旦新建它就会立即执行,无法中途取消

    2. 如果不设置回调函数,promise内部抛出的错误,不会反应到外部

    3. 当处于pending状态时,无法得知目前进展到哪一个阶段(刚刚开始还是即将完成)

  • API

    • Promise.resolve

      • 若参数是Promise实例,那么Promise.resolve将不做任何修改,原封不动地返回这个实例

      • 若参数是thenable对象,Promise.resolve方法会将这个对象转为Promise对象,然后就立即执行thenable对象的then方法

      • 若参数是一个原始值,或是一个不具有then方法的对象,则Promise.resolve方法返回一个新的 Promise 对象,状态为resolved

      • 若不带有任何参数,直接返回一个resolved状态的 Promise 对象

    • Promise.reject(其参数会原封不动地作为reject的理由,变成后续方法的参数,这一点与Promise.resolve方法不一致)

    • Promise.all(其中任意一个 promiserejectPromise.all 就会立即被 reject ,数组中其它未执行完的 promise 依然在执行, Promise.all 没有任何措施可以取消它们的执行)

      • 适合场景:彼此相互依赖,其中任何一个被 reject ,其它都失去了价值

    • Promise.allSettled

      • 适合场景:彼此互不依赖,其中任何一个被 reject ,对其它都没有影响

      • 适合场景:期望知道每个 promise 的执行结果

    • Promise.any

    • Promise.prototype.then

    • Promise.prototype.finally

      • 由于无法知道promise的最终状态,所以finally的回调函数中不接收任何参数,仅用于无论最终结果如何都要执行的情况

      • Promise.resolve(2).then(() => {}, () => {}) (resolved的结果为undefined)不同,Promise.resolve(2).finally(() => {}) resolved的结果为2,同样的Promise.reject(3).finally(() => {})rejected 的结果为3

  • Knowledge Point

    • 三种状态:pendingfulfilledrejected

    • 初始状态是pending, 执行了resolvePromise状态会变成fulfilled; 执行了rejectPromise状态会变成rejected

    • Promise状态不受外界影响

    • Promise只以第一次决议为准,第一次成功就永久为fulfilled,第一次失败就永远状态为rejected

    • Promise中有throw的话,就相当于执行了reject

    • Promise里没有执行resolvereject以及throw的话,这个promise的状态也是pending

    • 基于上一条,pending状态下的promise不会执行then中的回调函数

    • 必须给Promise对象传入一个执行函数,否则报错

Generator

A/A

  • 语法简洁,更像是同步代码,也更符合普通的阅读习惯

  • 改进JS中异步操作串行执行的代码组织方式,减少callback的嵌套

  • Promise中不能自定义使用try/catch进行错误捕获,但是在Async/await中可以像处理同步代码处理错误

async返回值

await 右值类型区别

  • await后面接非 thenable 类型,会立即向微任务队列添加一个微任务then但不需等待

thenable

thenable类型

  • await 后面接 thenable 类型,需要等待一个 then 的时间之后执行

==Promise类型==

await一定要等到右侧的表达式有确切的值才会放行,否则将一直等待

demo

Practices

并行调用

让Promise.all正常执行完成即使出现异常

race使用场景

  • 使用Promise.race把异步操作和定时器放到一起,若定时器先触发,认为超时,告知用户

  • 图片等资源有多个存放路径,但是不确定哪个路径的资源更快,可以用该方法同时请求多个路径,哪个路径的资源最先拿到,使用哪个资源

allSettled使用场景

红黄绿灯

异步执行函数

generator实现

PromiseQueue

Last updated