async

why async
传统callback方式
Promise
解决问题
多层嵌套的问题
每种任务的处理结果存在两种可能性(fulfilled or rejected, default is pending),那么需要在每种任务执行结束后分别处理这两种可能性
如何解决
回调函数延迟绑定
返回值穿透
错误冒泡
缺点
无法取消Promise,一旦新建它就会立即执行,无法中途取消
如果不设置回调函数,promise内部抛出的错误,不会反应到外部
当处于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(其中任意一个promise被reject,Promise.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
三种状态:
pending、fulfilled和rejected初始状态是
pending, 执行了resolve,Promise状态会变成fulfilled; 执行了reject,Promise状态会变成rejectedPromise状态不受外界影响Promise只以第一次决议为准,第一次成功就永久为
fulfilled,第一次失败就永远状态为rejectedPromise中有
throw的话,就相当于执行了rejectPromise里没有执行
resolve、reject以及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