美文网首页前端笔记
async(异步) 函数

async(异步) 函数

作者: 好奇男孩 | 来源:发表于2018-05-15 21:49 被阅读1次

    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('/e/f');
      const f2 = yield readFile('/e/s');
      console.log(f1.toString());
      console.log(f2.toString());
    };
    

    写成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());
    };
    

    Generator 函数与async函数的区别;

    • Generator 函数的执行必须靠执行器,async函数自带执行器;

    • async和await,比起星号和yield,语义更清楚了。async表示函数里有异步操作,await表示紧跟在后面的表达式需要等待结果

    • yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值

    • async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象

    async 函数让异步任务编程写成类似同步任务,可读性再次提升;

    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);
    

    注意事项

    • async函数内部抛出错误,会导致返回的 Promise 对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。所以尽量把await命令放在try...catch代码块中
    async function myFunction() {
      try {
        await somethingThatReturnsAPromise();
      } catch (err) {
        console.log(err);
      }
    }
    
    • async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误
    async function getTitle(url) {
      let response = await fetch(url);
      let html = await response.text();
      return html.match(/<title>([\s\S]+)<\/title>/i)[1];
    }
    getTitle('https://tc39.github.io/ecma262/').then(console.log)
    // "ECMAScript 2017 Language Specification"
    
    • await命令只能用在async函数之中,如果用在普通函数,就会报错
    async function dbFuc(db) {
      let docs = [{}, {}, {}];
    
      // 报错
      docs.forEach(function (doc) {
        await db.post(doc);
      });
    }
    

    相关文章

      网友评论

        本文标题:async(异步) 函数

        本文链接:https://www.haomeiwen.com/subject/zppydftx.html