ES6 async函数(对比generator函数(内置执行器、语义、适用性、返回)、使用形式、用法(返回对象及状态变化)、await命令、错误处理、使用注意点、顶层await)

本文详细介绍了async函数与generator函数的区别,展示了它们如何通过内置执行器简化异步操作,并强调了async函数的更好语义和更广泛的应用。重点讲解了await命令的使用、Promise状态管理和顶层await在ES6模块中的应用,同时提到了Generator函数的基础概念和注意事项。

目录

async函数

对比generator函数

内置执行器。

更好的语义。

更广的适用性。

返回值是 Promise。

使用形式

用法

基础用法

 返回 Promise 对象

Promise 对象的状态变化

await 命令

错误处理 

 使用注意点

顶层await

​Generator函数介绍


async函数

async 函数是Generator 函数的语法糖。它将Generator 函数的星号(*)替换成async,将yield替换成await

对比generator函数

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

内置执行器。

Generator 函数的执行必须靠执行器,所以才有了co模块,而async函数自带执行器。也就是说,async函数的执行,与普通函数一模一样,只要一行。

更好的语义。

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

更广的适用性。

co模块约定,yield命令后面只能是 Thunk 函数或 Promise 对象,而async函数的await命令后面,可以是 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时会自动转成立即 resolved 的 Promise 对象)。

返回值是 Promise。

async函数的返回值是 Promise 对象,这比 Generator 函数的返回值是 Iterator 对象方便多了。你可以用then方法指定下一步的操作。

使用形式

// 函数声明
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 () => {};

用法

注意await后面后面只有接Promise时才会等待Promise对象到fulfilled状态(即内部执行了resolve函数)才会往下执行,如果不是Promise对象,执行顺序和普通函数无差别。

基础用法

下面代码指定 50 毫秒以后,输出hello world。

function timeout(ms) {
  return new Promise((resolve) => {
    setTimeout(resolve, ms);
  });
}
async function asyncPrint(value, ms) {
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值