当前位置: 代码迷 >> 综合 >> ES6 async 函数
  详细解决方案

ES6 async 函数

热度:69   发布时间:2023-10-21 13:41:12.0

async 函数

  1. 基本用法

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

async函数返回的 Promise 对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

  • 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 () => {
    };
  • async函数内部return语句返回的值,会成为then方法回调函数的参数。
async function f() {
    return 'hello world';
}f().then(v => console.log(v))
// "hello world"
  1. await 命令

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

async function f() {
    // 等同于// return 123;return await 123;
}f().then(v => console.log(v))
// 123
  • 任何一个await语句后面的 Promise 对象变为reject状态,那么整个async函数都会中断执行。
async function f() {
    await Promise.reject('出错了');await Promise.resolve('hello world'); // 不会执行
}// 可执行方法一
async function f() {
    try {
    await Promise.reject('出错了');} catch(e) {
    }return await Promise.resolve('hello world');
}f()
.then(v => console.log(v))
// hello world// 可执行方法二
async function f() {
    await Promise.reject('出错了').catch(e => console.log(e));return await Promise.resolve('hello world');
}f()
.then(v => console.log(v))
// 出错了
// hello world
  1. 错误处理
  • 如果await后面的异步操作出错,那么等同于async函数返回的 Promise 对象被reject。
async function f() {
    await new Promise(function (resolve, reject) {
    throw new Error('出错了');});
}f()
.then(v => console.log(v))
.catch(e => console.log(e))
// Error:出错了
  1. 使用注意点
  • 多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
// 非同时触发
let foo = await getFoo();
let bar = await getBar();// 同时触发写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);// 同时触发写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

注:await只能存在于全局或async函数中,否则会报错。

  相关解决方案