ES6基础知识(async 函数)

1.async 函数是什么?一句话,它就是 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);
    });
  });
};

//Generator 函数
const gen = function* () {
  const f1 = yield readFile(‘/etc/fstab‘);
  const f2 = yield readFile(‘/etc/shells‘);
  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());
};

async函数就是将 Generator 函数的星号(*)替换成async,将yield替换成await,async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。进一步说,async函数完全可以看作多个异步操作,包装成的一个 Promise 对象,而await命令就是内部then命令的语法糖。

2.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 () => {};

3.只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数

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

上面代码中,函数getTitle内部有三个操作:抓取网页、取出文本、匹配页面标题。只有这三个操作全部完成,才会执行then方法里面的console.log

4.按顺序完成异步操作,依次远程进行ajax请求,然后按照请求的顺序输出结果

let urls = [
    ‘https://www.easy-mock.com/mock/5c73528306ffee27c6b2f0aa/testAerial/pointarr‘,
    ‘https://www.easy-mock.com/mock/5b62549fbf26d2748cff3cf4/dashuju/visualize‘
];

async function loader1(urls){//所有远程操作都是继发。只有前一个 URL 返回结果,才会去读取下一个 URL
    for(let url of urls){
        const response = await $.getJSON(url).then((res) => res);
        console.log(response);//ajax先后请求并返回结果
    }
}
loader1(urls);

5.并发发出远程ajax请求,同时输出结果

let urls = [
    ‘https://www.easy-mock.com/mock/5c73528306ffee27c6b2f0aa/testAerial/pointarr‘,
    ‘https://www.easy-mock.com/mock/5b62549fbf26d2748cff3cf4/dashuju/visualize‘
];

async function loader(urls){//map方法的参数是async函数,但它是并发执行的,因为只有async函数内部是继发执行,外部不受影响。后面的for..of循环内部使用了await,因此实现了按顺序输出
    const results = urls.map(async url => {
        const response = await $.getJSON(url).then((res) => res);
        return response;
    });

    for(let text of results){
        console.log(await text);//ajax一起请求同时返回结果
    }

}
loader(urls);

6.异步遍历器与同步遍历器

const asyncIterable = createAsyncIterable([‘a‘, ‘b‘]);
const asyncIterator = asyncIterable[Symbol.asyncIterator]();//部署异步遍历器接口

asyncIterator
.next()
.then(iterResult1 => {
  console.log(iterResult1); // { value: ‘a‘, done: false }
  return asyncIterator.next();
})
.then(iterResult2 => {
  console.log(iterResult2); // { value: ‘b‘, done: false }
  return asyncIterator.next();
})
.then(iterResult3 => {
  console.log(iterResult3); // { value: undefined, done: true }
});
let arr = [‘a‘, ‘b‘, ‘c‘];
let iter = arr[Symbol.iterator]();//部署同步遍历器

iter.next() // { value: ‘a‘, done: false }
iter.next() // { value: ‘b‘, done: false }
iter.next() // { value: ‘c‘, done: false }
iter.next() // { value: undefined, done: true }

备注:文中多数内容摘自阮一峰老师文章,仅供自我学习查阅。

原文地址:https://www.cnblogs.com/xingxingclassroom/p/10504092.html

时间: 2024-10-10 02:19:45

ES6基础知识(async 函数)的相关文章

深入浅出ES6教程『async函数』

大家好,本人名叫苏日俪格,大家叫我 (格格) 就好,在上一章节中我们学到了Symbol & generator的用法,下面我们一起来继续学习async函数: async [?'z??k]:这个单词看起来很怪异,它的原型是asynchrony,意为异步,一般单词按理说都能把音准读个大概,这个就... 与其同时呢,也有的人看了这个词想到了放在script标签里的异步脚本,但是此async非彼async,这个async是ES2017出来的,也是用来处理异步的,和ES6中的promise类似,nodeJ

ES6中的async函数

一.概述 async 函数是 Generator 函数的语法糖 使用Generator 函数,依次读取两个文件代码如下 var fs = require('fs'); var readFile = function (fileName) { return new Promise(function (resolve, reject) { fs.readFile(fileName, function(error, data) { if (error) return reject(error); re

阮一峰老师的ES6入门:async 函数

async 函数 1. 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便. async 函数是什么?一句话,它就是 Generator 函数的语法糖. 前文有一个 Generator 函数,依次读取两个文件. const fs = require('fs'); const readFile = function (fileName) { return new Promise(function (resolve, reject) { fs.readFile(fileNam

ES6基础知识(Generator 函数应用)

1.Ajax 是典型的异步操作,通过 Generator 函数部署 Ajax 操作,可以用同步的方式表达 function* main() { var result = yield request("http://some.url"); var resp = JSON.parse(result); console.log(resp.value); } function request(url) { makeAjaxCall(url, function(response){ it.nex

ES6基础知识(Reflect)

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" con

ES6 基础知识-----简记 let const

ES5中只有函数作用域和全局作用域,声明变量使用var,在es6中添加声明变量 let const let 声明块级作用域变量, let 不存在变量提升 var命令会发生"变量提升"现象,即变量可以在声明之前使用,值为undefined.这种现象多多少少是有些奇怪的,按照一般的逻辑,变量应该在声明语句之后才可以使用. 为了纠正这种现象,let命令改变了语法行为,它所声明的变量一定要在声明后使用,否则报错. var 声明的变量可以在声明之前使用,是undifind,存在变量提升现象,le

es6基础知识

1.超引用:(...) 用于取出参数对象中的所有可遍历属性,拷贝到当前对象之中 function fun(...args){ console.log(args); //[1,2,3,4,5,6] args.push(7); console.log(args); //[1,2,3,4,5,6,7] }fun(1,2,3,4,5,6) 2.解构赋值: 赋值: var a = 10,b = 20,c = 30; console.log(a,b,c) //10 20 30 解构: //数组的格式 var

Python基础知识之函数、模块

1.Python模块. Python一个.py后缀的文件,称为模块.Python模块可以包含变量.函数.类,同时类中又可以定义变量和函数. 2.Python模块导入. (1) Python模块全部导入方式:from 模块名 import * (2) Python模块按需导入方式:from 模块名 import 函数名/类名 3.函数.常用函数如下. str(o):将数字转化为字符串函数, int(o):将字符串转化为数字函数. format():字符串格式化函数. replace:字符串替换函数

php基础知识【函数】(8)xml和变量函数

 一.XML函数 参数类型 data    --string,需要解析的数据集. parser  --resource,一个指向要取得字节索引的 XML 解析器的引用.  1.创建和释放XMl解析器 xml_parser_create([string encoding]) --建立一个新的 XML 解析器并返回可被其它 XML 函数使用的资源句柄. xml_parser_free(parser) --释放指定的 XML 解析器 2.获取错误信息 xml_error_string (code) -