JS-async-await

102 阅读2分钟

async function(异步函数)

async关键字

  • async关键字用于声明一个异步函数

    • asyncasynchronous
    • syncsynchronous
  • async函数的写法有很多

    • 1.async function() {}
      2.const foo2 = async function() {}
      3.const foo3 = asunc () => {}
      4.class Person {async foo() {}}
      

执行流程

  • 异步函数默认情况下与普通函数一致,内部代码是同步执行

  • 异步函数有返回值时,与普通函数的区别

    • 异步函数的返回值被包裹Promise.resolve
    • 返回值如果是PromisePromise.resolve状态会由Promise决定
    • 返回值如果是一个对象并实现了thenable,那么会由对象的then方法决定
  • 如果在异步函数中抛出异常,程序不会像普通函数那样报错,而是会作为Promise的reject传递

// async function foo1() {}
// const foo2 = async () => {};
// class Foo {
//   async foo3() {}
// }// 默认与普通函数执行流程一样
async function foo() {
    console.log("start");
​
    // 异步函数中的异常,会被作为异步函数返回的Promise的reject值
    throw new Error("throw err");
​
    console.log("end");
​
    // 1.返回普通值
    return "aa";
​
    // 2.返回thenable
    // return {
    //   then(resolve, reject) {
    //     resolve('thenable')
    //   }
    // }
​
    // 3.返回promise
    // return new Promise((resolve, reject) => {
    //   resolve('promise')
    // })
}
​
// 1.与普通函数区别-返回值-一定是一个Promise
const promise = foo();
promise
    .then((res) => {
    console.log(res);
})
    .catch((err) => console.log("异常被捕获:", err));
​
// 2.与普通函数区别-异常-
// 普通函数抛出异常后,后续代码不执行;异步函数抛出异常后,代码继续执行
// foo()
console.log(
    "后续代码"
);

await关键字

  • async函数的另一个特殊之处是可以在内部使用await关键字

  • awsit关键字的特点

    • 使用await后面通常会跟一个表达式,这个表达式会返回一个Promiseawait会等到Promise的状态变为fulfilled之后继续执行异步函数
    • 如果await后面是一个普通,那么会直接返回这个
    • 如果await后面是一个thenable对象,那么会根据对象then方法调用决定
    • 如果await后面的表达式返回的Promise是reject状态,那么会将这个reject结果直接作为函数的Promisereject值
function requestData() {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            // resolve("表达式");
            // 如果reject,则会把对应reject的值作为整个foo函数返回Promise对应的reject的值,在调用函数的时候使用catch可以捕获
            reject('表达式 reject')
        }, 2000);
    });
}
​
async function foo() {
    // 没有结果时,await后面的代码都不会执行
​
    // 1.await后面通常跟一个表达式
    const res1 = await requestData();
    console.log("等待Promise的状态改变为fulfilled", res1);
​
    // 2.await后面跟一个普通的值
    const res2 = await "普通的值";
    console.log("等待Promise的状态改变为fulfilled", res2);
​
    // 3.await后面跟一个thenable
    const res3 = await {
        then(resolve, reject) {
            resolve("thenable");
        },
    };
    console.log("等待Promise的状态改变为fulfilled", res3);
​
    // 4.await后面跟一个Promise
    const res4 = await new Promise((resolve, reject) => {
        resolve("promise");
    });
    console.log("等待Promise的状态改变为fulfilled", res4);
}
foo().catch(err => {
    console.log(err);
});