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 函数 含义 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。 async 函数是...
    huilegezai阅读 1,280评论 0 6
  • 含义 async函数是Generator函数的语法糖,它使得异步操作变得更加方便。 写成async函数,就是下面这...
    oWSQo阅读 2,006评论 0 2
  • 前面的话 ES2017标准引入了async 函数,使得异步操作变得更加方便。本文将详细介绍async函数 概述 a...
    CodeMT阅读 1,366评论 0 3
  • 简单介绍下这几个的关系为方便起见 用以下代码为例简单介绍下这几个东西的关系, async 在函数声明前使用asyn...
    _我和你一样阅读 21,282评论 1 24
  • async 函数 ES2017 标准引入了 async 函数,使得异步操作变得更加方便。async 函数是什么?一...
    _羊羽_阅读 2,139评论 0 1