You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
varparallel=asyncfunction(){console.log('==PARALLEL with await Promise.all==');// Start 2 "jobs" in parallel and wait for both of them to completeawaitPromise.all([(async()=>console.log(awaitresolveAfter2Seconds()))(),(async()=>console.log(awaitresolveAfter1Second()))()]);}
一、
async/await
语法1.1
async
函数(异步函数)async
修饰的函数就是异步函数async
要放在function
前面而不是在其后面,它是修饰函数的。并且任何可以是函数的地方(无论是函数声明语句还是函数表达式)都可以使用async
修饰。async
函数会做两件事:Promise
对象:await
。Promise
对象,则也是会包裹成Promise
思考:是采用
new Promise(resolve => resolve())
方式还是使用Promsie.resolve
包裹的呢?(下面揭露)1.2
await
操作符为什么叫
await
而不是wait
?前者是及物动词,后者不是。语法
await
是个操作符,它表示等待一个Promise
对象进入终态。await
只能用在async
函数里,它让async
函数暂停执行,一直到Promise
对象进入终态;Promise
对象的终态对await
行为的影响:await
表达式的值;reason
作为异常值;await
后面可以是任意表达式,await
会把后面表达式值包裹为一个fulfilled
的 Promise对象(即使表达式的值是
Promise`对象)思考:
await
是采用new Promise(resolve => resolve())
方式还是直接使用Promsie.resolve
包裹后面表达式的值?揭秘
先试试下面代码输出:
规范里应该是采用
new Promise(resolve => resolve())
,但是实现中有些进行了优化,即采用Promise.resolve
,目前测试下来Chrome(v81)已经优化了。但是总体各浏览器/nodejs存在实现差异。
扩展:
1.3 串行和并行问题
首先记住同一个函数作用域的
await
表达式都是依次执行,只有前面的await的Promise进行终态,才会执行下一个await。如果要让多个异步操作“并行”,则需要把await
放在不同的函数作用域里。MDN上面的例子很好,要好好看看:
就是把多个
await
表达式包装在多个匿名的异步函数里,这样他们就不在同一个函数作用域了,就不会产生依赖关系。总结一句话: 只把存在前后依赖的
await
放在同一个函数作用域里。大部分使用 async/await 困境也都是因为没弄清楚同步异步问题导致的。二、异常处理
2.1 基础
async
函数永远不会对外抛异常,它把内部异常转成返回值Promise的rejected的reason;await
会抛异常。2.2 关于异常处理
没有组好的方式,只有更适合的方式。
还有中写法(个人比较喜欢的方式):在调用链最外层try-catch,内部不用try-catch或内部try-catch处理后直接往外再抛。
三、为啥要使用async/await 进行异步流程管理 ?
async/await = Generator + Promise
Promise
的书写格式;参考
The text was updated successfully, but these errors were encountered: