<p id="jnj9j"></p>

<ruby id="jnj9j"></ruby>
<ruby id="jnj9j"></ruby>
<p id="jnj9j"><dfn id="jnj9j"></dfn></p>

    <p id="jnj9j"></p>

      async函数

      ES2017标准引入了async函数,使得异步操作变得更加方便。

      一、含义

      什么是async函数?它就是Generator函数的语法糖

      栗子:有一个Generator函数,依次读取两个文件。

      const fs = require(‘fs‘);
      
      const readFile = function (fileName) {
        return new Promise(function (resolve, reject) {
          fs.readFile(fileName, function(error, data) {
            if (error) return reject(error);
            resolve(data);
          });
        });
      };
      
      const gen = function* () {
        const f1 = yield readFile(‘/etc/fstab‘);
        const f2 = yield readFile(‘/etc/shells‘);
        console.log(f1.toString());
        console.log(f2.toString());
      };

      上面代码的函数gen可以写成async函数

      const asyncReadFile = async function () {
        const f1 = await readFile(‘/etc/fstab‘);
        const f2 = await readFile(‘/etc/shells‘);
        console.log(f1.toString());
        console.log(f2.toString());
      };

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

      二、基本用法

      async函数返回一个 Promise 对象,可以使用then方法添加回调函数。当函数执行的时候,一旦遇到await就会先返回,等到异步操作完成,再接着执行函数体内后面的语句。

      指定多少毫秒后输出一个值

      function timeout(ms) {
        return new Promise((resolve) => {
          setTimeout(resolve, ms);
        });
      }
      
      async function asyncPrint(value, ms) {
        await timeout(ms);
        console.log(value);
      }
      
      asyncPrint(‘hello world‘, 50);

      指定 50 毫秒以后,输出hello world

      async的多种使用形式

      // 函数声明
      async function foo() {}
      
      // 函数表达式
      const foo = async function () {};
      
      // 对象的方法
      let obj = { async foo() {} };
      obj.foo().then(...)
      
      // Class 的方法
      class Storage {
        constructor() {
          this.cachePromise = caches.open(‘avatars‘);
        }
      
        async getAvatar(name) {
          const cache = await this.cachePromise;
          return cache.match(`/avatars/${name}.jpg`);
        }
      }
      
      const storage = new Storage();
      storage.getAvatar(‘jake‘).then(…);
      
      // 箭头函数
      const foo = async () => {};

      返回Promise对象

      async函数返回一个 Promise 对象。

      async函数内部return语句返回的值,会成为then方法回调函数的参数。

      async function f() {
        return ‘hello world‘;
      }
      
      f().then(v => console.log(v))
      // "hello world"

      async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。

      async function f() {
        throw new Error(‘出错了‘);
      }
      
      f().then(
        v => console.log(v),
        e => console.log(e)
      )
      //Error: 出错了

      Promise对象的状态变化

      async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

      await命令

      正常情况下,await命令后面是一个 Promise 对象,返回该对象的结果。如果不是 Promise 对象,就直接返回对应的值。

      async function f() {
        // 等同于
        // return 123;
        return await 123;
      }
      
      f().then(v => console.log(v))
      // 123

      另一种情况是,await命令后面是一个thenable对象(即定义then方法的对象),那么await会将其等同于 Promise 对象。

      class Sleep {
        constructor(timeout) {
          this.timeout = timeout;
        }
        then(resolve, reject) {
          const startTime = Date.now();
          setTimeout(
            () => resolve(Date.now() - startTime),
            this.timeout
          );
        }
      }
      
      (async () => {
        const sleepTime = await new Sleep(1000);
        console.log(sleepTime);
      })();
      // 1000

      上面代码中,await命令后面是一个Sleep对象的实例。这个实例不是 Promise 对象,但是因为定义了then方法,await会将其视为Promise处理。

      任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。

      错误处理

      如果await后面的异步操作出错,那么等同于async函数返回的 Promise 对象被reject

      相关文章
      20017年香港六合彩63集 拜城县| 汽车| 博乐市| 南川市| 繁昌县| 富蕴县| 土默特右旗| 新沂市| 平乐县| 临潭县| 洛南县| 江口县| 星子县| 吴旗县| 宿州市| 广安市| 油尖旺区| 香格里拉县| 二连浩特市| 永宁县| 阳泉市| 鹤山市| 白河县| 孝感市| 米易县| 灵川县| 松江区| 交口县| 南宫市| 得荣县| 页游| 贞丰县| 海盐县| 阜宁县| 汶川县| 平塘县| 海宁市| 辽宁省| 利辛县| 柳河县| 博爱县| 荔浦县| 铜山县| 诸暨市| 白城市| 乐都县| 中方县| 蒙城县| 宜兰县| 宁都县| 青河县| 海林市| 佛山市| 会东县| 乌拉特前旗| 诸城市| 沧州市| 蚌埠市| 德安县| 兴宁市| 合水县| 夏河县| 惠东县| 石景山区| 乡宁县| 阳原县| 巩义市| 依安县| 镇沅| 吴旗县| 视频| 交城县| 石狮市| 濮阳市| 安乡县| 宝坻区| 巴彦县| 伊宁县| 南投市| 九龙县| 桦川县| 花莲县| 格尔木市| 山东省| 汉中市| 平遥县| 巩留县| http://wap.hsleepr888.com http://wap.flselecto888.com http://wap.gwzonel888.com http://wap.flsearcho888.com http://m.gworkl888.com http://gwastel888.com http://www.hwalkr888.com http://www.gwvaluel888.com http://gwviewl888.com http://www.flsecondo888.com http://wap.htowerr888.com