async函数,使异步操作变得更加方便。async函数时ES2017标准引入的新特性。

基本用法

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

// 函数声明
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命令

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

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

示例

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