初探ES7中的 async、await

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/CodingNoob/article/details/85000104

任意一个名称都是有意义的,先从字面意思来理解。async 是“异步”的简写,而 await 可以认为是 async wait 的简写。所以应该很好理解 async 用于申明一个 function 是异步的,而 await 用于等待一个异步方法执行完成。

另外还有一个很有意思的语法规定,await 只能出现在 async 函数中。然后细心的朋友会产生一个疑问,如果 await 只能出现在 async 函数中,那这个 async 函数应该怎么调用?

如果需要通过 await 来调用一个 async 函数,那这个调用的外面必须得再包一个 async 函数,然后……进入死循环,永无出头之日……

如果 async 函数不需要 await 来调用,那 async 到底起个啥作用?

async 起什么作用

这个问题的关键在于,async 函数是怎么处理它的返回值的!

我们当然希望它能直接通过 return 语句返回我们想要的值,但是如果真是这样,似乎就没 await 什么事了。所以,写段代码来试试,看它到底会返回什么:

async function testAsync() {
    return "hello async";
}

const result = testAsync();
console.log(result);

看到输出就恍然大悟了——输出的是一个 Promise 对象。

await 到底在等啥

一般来说,都认为 await 是在等待一个 async 函数完成。不过按语法说明,await 等待的是一个表达式,这个表达式的计算结果是 Promise 对象或者其它值(换句话说,就是没有特殊限定)。

因为 async 函数返回一个 Promise 对象,所以 await 可以用于等待一个 async 函数的返回值——这也可以说是 await 在等 async 函数,但要清楚,它等的实际是一个返回值。注意到 await 不仅仅用于等 Promise 对象,它可以等任意表达式的结果,所以,await 后面实际是可以接普通函数调用或者直接量的。所以下面这个示例完全可以正确运行。

代码:

function fn01 () {
        // 加载用户角色
        return new Promise((resolve, reject) => {
          _this.$https.get('api/*******').then((response) => {
            console.log('执行fn01');
            resolve();
          }).catch(function (error) {
            console.log(error);
          });
        });
      };

      function fn02 () {
        // 设置用户顶级组织
        return new Promise((resolve, reject) => {
          _this.$https.post('api/*******').then((response) => {
            console.log('执行fn02');
            resolve();
          }).catch(function (error) {
            console.log(error);
          });
        });
      };

      // 公共设置部分

      function fn03 () {
        // 获取菜单控制权限
        return new Promise((resolve, reject) => {
          _this.$https.get('api/*******' + _this.$route.query.mid).then((response) => {
            console.log('执行fn03');
            resolve();
          }).catch(function (error) {
            console.log(error);
          });
        });
      };

      async function action () {
        await fn03();
        await fn02();
        await fn01();
        return '执行到最后了';
      };
      action().then(val => {
        alert(val);
      });

结果:

如果项目过程中要控制异步执行的顺序,其实通过Promise.all放法也可以达到类似的效果,如下

Promise.all([fn01(), fn02(), fn03()]).then(result => console.log(result)).catch(e => console.log(e));

猜你喜欢

转载自blog.csdn.net/CodingNoob/article/details/85000104