ES6的Promise———async await
写这篇博客关于async-await的主要原因:在我自己构建的商城中用的后端技术koa2中用到async-await,主要是对async-await理解不深导致代码bug.
本质
async/await可以说是co模块和生成器函数的语法糖。用更加清晰的语义解决js异步代码。为了让我们用同步的方式去写异步的代码。
熟悉co模块的同学应该都知道,co模块是TJ大神写的一个使用生成器函数来解决异步流程的模块,可以看做是生成器函数的执行器。而async/await则是对co模块的升级,内置生成器函数的执行器,不再依赖co模块。同时,async返回的是Promise。
async
用来声明该函数有异步操作,它会将函数的返回值通过Promise.resolve()包装成promise,所以async总会返回一个Promise对象。
await
理解为async wait
,只能用在async
函数里面。await 后面可以跟任何的JS 表达式。虽然说 await 可以等很多类型的东西,但是它最主要的意图是用来等待 Promise 对象的状态被 resolved。如果await的是 promise对象会造成异步函数停止执行并且等待 promise 的解决(里面涉及到async-await的执行顺序的问题),如果等的是正常的表达式则立即执行。若 Promise
处理异常(rejected
),await
会把 Promise
的异常原因抛出。
作个比较
在ES6中的Promise将我们从ES5中的回调地狱中解救出来,但是当你处理相互依赖的异步任务,就会出现一连串的then链
1 | function doSomething(second, param) { |
async-await
1 | async function doSomething(){ |
参考
本文由 Abert 创作,采用 知识共享署名 4.0 国际许可协议。
本站文章除注明转载/出处外,均为本站原创或翻译,转载请务必署名。