async 函数(笔记 )

基本用法

执行函数时,遇到await,会等到异步操作完成,再接着执行函数体内后面的语句。
如下代码会先打印1,再打印2。

function a() {
        return new Promise((resolve) => {
            setTimeout(function() {
                console.log(1);
                resolve();
            }, 2000)
        })
    }

    async function b() {
        await a(); //a要返回一个Promise对象,否则await对它不起作用
        console.log(2)
    }
    b()

返回Promise 对象

1.async函数返回一个 Promise对象。
2.async函数内部return语句返回的值 ,会成为then方法回调函数的参数。

async function asyncPrint() {
      return "hello world";
}

asyncPrint().then(greeting => console.log(greeting)); //hello world

3.async函数内部抛出错误,会导致返回的Promise对象变为reject状态。抛出的错误对象会被catch方法回调函数接收到。

async function asyncPrint() {
      throw new Error('出错了');
}

asyncPrint()
.then(greeting => console.log(greeting))
.catch(err => console.log(err)); // Error: 出错了
  1. async函数返回的Promise对象,必须等到内部所有await命令后面的 Promise 对象执行完,才会发生状态改变,除非遇到return语句或者抛出错误。也就是说,只有async函数内部的异步操作执行完,才会执行then方法指定的回调函数。

await 命令

await后面应该返回一个Promise对象,如果不是,就直接返回这个值。

async function f() {
  // 等同于
  // return 123;
  return await 123;
}

f().then(v => console.log(v))
// 123

注意点

  1. 上面提到因为抛出错误会让状态变为reject , 所以最好把await命令放在try...catch代码块中, 如下
async function myFun() {
  try {
    await aa();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法

async function myFun() {
  await aa()
  .catch(function (err) {
    console.log(err);
  });
}
  1. getFoogetBar是两个独立的异步操作,被写成继发关系。这样比较耗时,因为只有getFoo完成以后,才会执行getBar,完全可以让它们同时触发。
let foo = await getFoo();
let bar = await getBar();

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

// getFoo和getBar都是同时触发,这样就会缩短程序的执行时间
// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;

你可能感兴趣的:(async 函数(笔记 ))