下面是对 ES6 async函数的整理,希望可以帮助到有需要的小伙伴~

文章目录

  • async函数是什么
  • 异步函数声明式
  • 异步函数表达式
  • 返回Promise对象
  • await表达式
  • await处理错误
  • async函数执行一组Promise
  • 注意事项
    • 使用try...catch语句
    • 多个await同时触发
    • await表达式的限制
    • Symbol
      • Symbol的注意事项
      • Symbol的方法
      • Symbol与for...in

async函数是什么

ECMAScript 2017规范引入了async函数,该函数的主要目的是简化使用Promise异步调用的操作,并对一组Promise执行某些操作。

Promise类似于结构化回调

async、await类似于组合生成器和Promises。

await 操作符用于等待一个Promise 对象。它只能在异步函数 async function 中使用

function resolveAfter2Seconds() {return new Promise(resolve => {setTimeout(()=>{resolve('resolved');},2000);})
}async function asyncCall() {console.log("calling"); // calling// 暂停当前asyncCall()函数的执行,等待Promise处理完成后再执行asyncCall()函数var result = await resolveAfter2Seconds();console.log(result); // resolved
}
asyncCall();

异步函数声明式

异步函数声明式用于定义一个返回Promise对象的异步函数。

异步函数是指通过事件循环异步执行的函数,它会通过一个隐式的Promise返回其结果

异步函数的语法和结构与同步函数比较像。

async function name([param[, param[, ... param]ll) { statements }
  • name:函数名称
  • param:要传递给函数的参数的名称。
  • statements:表示函数体语句。

异步函数表达式

步函数表达式用于在表达式中定义异步函数。

let name = async function([param1[, param2[ .., paramN]]]) { statements }
  • name:表示函数名称。
  • pacam:要传递给函数的参数的名称。
  • statements:表示函数体语句。

异步函数表达式与异步函数语句声明式的区别:

于异步函数表达式可以省略函数名称来创建一个匿名函数。

返回Promise对象

async函数返回一个Promise对象

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

实例1:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JPVf9Xvg-1608908797743)(es6/async1.png)]

实例2:

async function f() {return "hello world";
}
// f().then(v=>console.log(v)); // hello world// 等同于
f().then(function (v) {console.log(v); // hello world}
)// 上述异步函数async function中没有await表达式,因为异步函数会先创建Promise对象,然后再执行

注意:

上述异步函数async function中没有await表达式,因为异步函数会先创建Promise对象,然后再执行

await表达式

await表达式用于等待一个Promise对象,它只能在异步函数中使用

[return .value] = await expression;
  • expression:一个Promise对象或者任何要等待的值。

  • return…alue

    • 如果等待的是Promise对象,返回Promise对象的处理结果(成功或失败)。
    • 如果等待的不是Promise 对象,则返回该值本身。
function createPromise(){return new Promise((resolve,reject) => {setTimeout(() => {resolve("执行成功");},200);});
}async function myAsync() {console.log("当前异步函数被调用");var result = await createPromise();console.log("Promise对象执行的结果:" + result);
}myAsync(); // 调用异步函数

await处理错误

为了防止报错,使用try…catch语句

function createPromise(){return new Promise((resolve,reject) => {setTimeout(() => {reject("执行失败");},200);});
}async function myAsync() {console.log("当前异步函数被调用"); // 当前异步函数被调用try {// 执行后会出错的语句var result = await createPromise();} catch(e) {// 提示错误的语句console.log("Promise对象执行的结果:" + e); // Promise对象执行的结果:执行失败}}myAsync(); // 调用异步函数

async函数执行一组Promise

一组Promise对象的执行顺序只与async函数中await的顺序有关。

let promise1 = new Promise((resolve,reject) => {setTimeout(() => {resolve("one");},300);
});let promise2 = new Promise((resolve,reject) => {setTimeout(() => {resolve("two");},200);
});let promise3 = new Promise((resolve,reject) => {setTimeout(() => {resolve("three");},100);
});async function myAsync() {let result1 = await promise1;console.log(result1);let result2 = await promise2;console.log(result2);let result3 = await promise3;console.log(result3);
}
myAsync();// Promise对象执行的顺序与设置的延迟时间没有关系,Promise对象执行的顺序只与async函数中的顺序有关

注意事项

使用try…catch语句

await命令后面的Promise 对象,运行结果可能是rejected,有2种处理错误的方法

  1. try…catch语句
  2. Promise的catch语句

实例:

function fun() {return new Promise((resolve,reject) => {reject("执行失败");})
}// try...catch处理错误
async function myAsync1() {try {await fun();}catch (e) {console.log(e);}
}myAsync1(); // 执行失败// catch处理错误
async function myAsync2() {await fun().catch(function (err) {console.log(err);})
}myAsync2(); // 执行失败

多个await同时触发

多个await表达式后面的异步操作,如果不存在继发关系,最好让它们同时触发。

let promise1 = new Promise((resolve,reject) => {setTimeout(() => {resolve("one");},300);
});let promise2 = new Promise((resolve,reject) => {setTimeout(() => {resolve("two");},200);
});let promise3 = new Promise((resolve,reject) => {setTimeout(() => {resolve("three");},100);
});// promise1,promise2,promise3依次独立的异步操作
/*async function myAsync() {let result1 = await promise1;console.log(result1);let result2 = await promise2;console.log(result2);let result3 = await promise3;console.log(result3);
}
myAsync();*/// Promise对象执行的顺序与设置的延迟时间没有关系,Promise对象执行的顺序只与async函数中的顺序有关// promise1,promise2,promise3同时执行异步操作
async function myAsync3() {let [result1,result2,result3] = await Promise.all([promise1,promise2,promise3]);console.log(result1,result2,result3)
}
myAsync3(); // one two three

promise1,promise2,promise3是3个独立的异步操作(即互不依赖),被写成继发关系一个一个的进行异步操作是比较耗时间的,可以让promise1,promise2,promise3同时触发,同时进行异步操作(同时触发的条件:promise1,promise2,promise3按顺序执行)。

await表达式的限制

await表达式只能用在async函数之中,如果用在普通函数,就会报错。

async function f1() {let docs = [{},{},{}];// 报错docs.forEach(function (doc) {await db.post(doc); // SyntaxError: await is only valid in async function 翻译:SyntaxError: await只在异步函数中有效})
}

Symbol

ECMAScript 6新增了第六种原始类型Symbol(符号)类型。

Symbol类型是唯一的并且是不可修改的,并且也可以用来作为Object 的 key 值。

Symbol类型的变量是通过调用Symbol()函数生成的:

Symbol([description])
  • description:可选的字符串。Symbol的描述,可用于调试但不能访问Symbol本身。

注意:

由于Symbol类型是原始类型,是不能通过new Symbol()来创建对象的。

实例:

/*ES5 的 5种原始类型* string - String* number - Number* string - String* undefined - Undefined* null - NullES6 新增一种原始类型Symbol
*/let num = 100;  // new Number()
let str = "软件学院"; // new String()
let boo = true;
/*symbol类型是ES6新增的第六种原始类型Symbol类型是唯一的并且是不可修let symbol = Symbol()原始类型是不能创建对象的
*/let symbol = Symbol();
console.log(typeof symbol); // symbol 判断原始类型必须使用typeoflet symbol2 = Symbol("xxx");
console.log(symbol2); // Symbol(xxx)
let symbol3 = Symbol(5);
console.log(symbol3); // Symbol(5)// 修改变量的值,而不是修改类型,Symblo是不能转为其它类型的
symbol3 = Symbol("yyy");
console.log(symbol3); // Symbol(yyy)

Symbol的注意事项

当使用Symbol值进行类型转换时需要注意一些事情:

  • 尝试将一个symbol值转换为一个number值时,会抛出一个工ypeError错误。
  • Object(symbol) == symnbol表达式的结果返回true。
  • 阻止从一个symbol 值隐式地创建一个新的string类型的属性名。

Symbol的方法

  • Symbol.for()方法

    该方法会根据给定的键key,从symbol注册表中查找指定的key。

    • 如果找到了,则返回它。
    • 如果没有找到,新建一个与该键关联的 symbol,并放入全局symbol注册表中。
    Symbol.for(key);
    
    • 一个字符串,作为symbol注册表中与某symbol关联的键。

    • Symbol.for()方法与Symbol()的不同:

      • 用Symbol.for()方法创建的的symbol会被放人一个全局symbol注册表中
      • 用Symbol()方法创建的的symbol不会被放人一个全局symbol注册表中

    注册表是一个典型的键值对key : value集合

    举例:

    kye - 存储的方式

    value - 当前安装的软件

  • Symbol.keyFor()方法

    该方法用于获取symbol注册表中与某个symbol关联的键。

    Symbol.keyFor(sym);
    
    • sym:存储在symbol注册表中的某个symbol.

Symbol与for…in

Symbols 在 for…in迭代中不可枚举。

Object.getOwnPropertyNames()不会返回symbol对象的属性,但是可以使用Object.getOwnPropertySymbols()得到它们.

var obj = {};
// 如果Symbol作为对象的属性名,属性名是不可枚举的
obj[Symbol("a")] = "a";
obj[Symbol.for("b")] = "b";
obj["c"] = "c";
obj.d = "d";for (var i in obj) {console.log(i); // c d 用Symbol作为对象的属性名的a和b是没有办法被枚举的
}

end 结束啦~

ES6 async函数(超级详细、易懂)相关推荐

  1. es6 async函数的实现原理

    async函数的实现原理 async函数的实现原理,就是将 Generator函数和自动执行器,包装在一个函数里. async function fn(args) { // ... } // 等同于 ...

  2. es6 async函数的语法

    async函数的语法 async函数的语法规则总体上比较简单,难点是错误处理机制. 返回 Promise 对象 async函数返回一个 Promise 对象. async函数内部return语句返回的 ...

  3. es6 async函数的基本用法

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

  4. es6 async函数的异步迭代器

    async函数的异步迭代器 <迭代器>一章说过,Iterator 接口是一种数据遍历的协议,只要调用迭代器对象的next方法,就会得到一个对象,表示当前遍历指针所在的那个位置的信息.nex ...

  5. es6 async函数实例:按顺序完成异步操作

    async函数实例:按顺序完成异步操作 实际开发中,经常遇到一组异步操作,需要按照顺序完成.比如,依次远程读取一组 URL,然后按照读取的顺序输出结果. ES6 Promise 的写法如下. func ...

  6. es6 async函数与其他异步处理方法的比较

    async函数与其他异步处理方法的比较 我们通过一个例子,来看 async函数与 Promise.Generator函数的比较. 假定某个 DOM 元素上面,部署了一系列的动画,前一个动画结束,才能开 ...

  7. 超级详细易懂的GhostNet解析

    GhostNet的不完全解析 CVPR2020 & IJCV2022(the extended version) Noah's Ark Lab, Huawei Technologies 论文地 ...

  8. 【ES6】异步操作和async函数

    [ES6]异步操作和async函数 一.基本概念 二.回调函数 三.Promise 四.async函数 查看更多ES6教学文章: 参考文献 引言:ES6新增的Generato.Promise.asyn ...

  9. es6 什么是async函数

    什么是async函数 ES2017 标准引入了 async函数,使得异步操作变得更加方便. async函数是什么?一句话,它就是 Generator函数的语法糖. 前文有一个 Generator函数, ...

最新文章

  1. 特征工程学习,19项实践Tips!代码已开源!
  2. LINQ之路系列博客后记
  3. 38行代码AC——L1-025 正整数A+B (15分)(~解题报告~)
  4. 面试必备!卖萌屋算法工程师思维导图—统计机器学习篇
  5. 维大杀器来了,未来云上服务器或将实现无人值守
  6. 软件测试 学习之路 linux基础命令 (二)
  7. jmail mysql_利用VB+jmail发送邮件源码
  8. Golang的并发模式
  9. 洛谷2486 【SDOI2011】染色(线段树+树链剖分)
  10. c#构造器的一点理解(三)
  11. PayPal美元提现到国内银行卡教程!
  12. 文本居中(内容居中)
  13. 语音识别技术的前世今生之前世
  14. 抗疫先锋 | 滴滴云携手你我,一起战“疫”,共克时艰
  15. LoRaWAN入网参数设置
  16. 思科、华为交换机链路聚合(LACP)配置实例
  17. 在线考试防作弊js代码
  18. AndroidStudio学习3 显示百度地图和实现定位功能
  19. DHCP欺骗攻击(yersinia应用)
  20. 本题要求编写程序,计算序列部分和 1 - 1/4 + 1/7 - 1/10 + ... 直到最后一项的绝对值不大于给定精度eps。

热门文章

  1. Spring Boot 部署与后台运行服务配置
  2. java的反射机制(第二篇)
  3. 获取httpservletrequest所有参数的名称和值
  4. 转: 技巧/诀窍:在ASP.NET中重写URL
  5. 第二届太原理工大学程序设计新生赛预赛(公开赛)题解
  6. matlab 高阶(一) —— assignin与evalin
  7. 物品的名字、品牌的认识
  8. Matlab Tricks(六)—— 矩阵乘法的实现
  9. scale data:线性空间映射
  10. 使用 matlab 数字图像处理(九)—— 去卷积(deconvolution,逆滤波复原)