async

async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,仅此而已。

  • async函数自带执行器,不必像generator函数执行完还需要next( )。
  • async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果。
  • async函数的返回值是 Promise 对象。

关键点async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。

  1. //async函数的返回值肯定是promise对象。即使不是也会使用Promise.resolve()进行转换。
  2. //因为需要返回promise对象,来捕获async内的错误。
  3. async function foo() {
  4. var a = await setTimeout(() => {
  5. console.log(1)
  6. }, 2000);
  7. return 2;
  8. }

await

await等待的是promise对象的resolve(value),接受到的值。如果不是promise对象,相当于await Promise.resolve( )。

  1. function time() {
  2. return new Promise((resolve, reject) => {
  3. setTimeout(() => {
  4. resolve(1);
  5. }, 1000)
  6. })
  7. }
  8. function time1() {
  9. return new Promise((resolve, reject) => {
  10. setTimeout(() => {
  11. resolve(2);
  12. }, 4000)
  13. })
  14. }
  15. async function foo() {
  16. let value1 = await time(); //等待resolve()的返回值(阻塞1s)
  17. console.log(value1); //执行
  18. let value2 = await time1(); //等待resolve()的返回值(阻塞4s)
  19. console.log(value2); //执行
  20. }
  21. console.log(foo());

async VS promise

问题async异步编程语法同promise优势在哪里?
处理多层回调。promise是通过then( )的链式调用,实现多层回调。但是在语义上仍感觉差一点。async直接想写同步代码一样,实现多层的回调,比promise有更好的语义。

参考

https://segmentfault.com/a/1190000007535316