美文网首页
ES6之async函数

ES6之async函数

作者: 四月天__ | 来源:发表于2017-09-19 17:16 被阅读27次

文章内容转自阮一峰老师博客.
语法学习

1.返回 Promise 对象

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

async function sayHello(){
  return 'Hello world'
}

sayHello().then(message=>console.log(message+'!!'));
// Hello world!!

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

async function getTitle(url) {
  let response = await fetch(url);
  let html = await response.text();
  return html.match(/<title>([\s\S]+)<\/title>/i)[1];
}
getTitle('https://tc39.github.io/ecma262/').then(console.log)

上面代码中,函数getTitle内部有三个操作:抓取网页、取出文本、匹配页面标题。只有这三个操作全部完成,才会执行then方法里面的console.log

3.await 命令
正常情况下,await命令后面是一个 Promise 对象。如果不是,会被转成一个立即resolve的 Promise 对象。

async function f() {
  return await 123;
}

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

上面代码中,await命令的参数是数值123,它被转成 Promise 对象,并立即resolve。
await命令后面的 Promise 对象如果变为reject状态,则reject的参数会被catch方法的回调函数接收到。

async function f() {
  await Promise.reject('出错了');
}

f()
.then(v => console.log(v))
.catch(e => console.log(e))
// 出错了

注意,上面代码中,await语句前面没有return,但是reject方法的参数依然传入了catch方法的回调函数。这里如果在await前面加上return,效果是一样的。

只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行。

async function f() {
  await Promise.reject('出错了');
  await Promise.resolve('hello world'); // 不会执行
}

上面代码中,第二个await语句是不会执行的,因为第一个await语句状态变成了reject。

有时,我们希望即使前一个异步操作失败,也不要中断后面的异步操作。这时可以将第一个await放在try...catch结构里面,这样不管这个异步操作是否成功,第二个await都会执行。

async function f() {
  try {
    await Promise.reject('出错了');
  } catch(e) {
  }
  return await Promise.resolve('hello world');
}

f()
.then(v => console.log(v))
// hello world

另一种方法是await后面的 Promise 对象再跟一个catch方法,处理前面可能出现的错误。

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

4.使用注意点

  • 前面已经说过,await命令后面的Promise对象,运行结果可能是rejected,所以最好把await命令放在try...catch代码块中。
async function myFunction() {
  try {
    await somethingThatReturnsAPromise();
  } catch (err) {
    console.log(err);
  }
}

// 另一种写法

async function myFunction() {
  await somethingThatReturnsAPromise()
  .catch(function (err) {
    console.log(err);
  });
}
  • 多个await命令后面的异步操作,如果不存在继发关系,最好让它们同时触发。
// 写法一
let [foo, bar] = await Promise.all([getFoo(), getBar()]);

// 写法二
let fooPromise = getFoo();
let barPromise = getBar();
let foo = await fooPromise;
let bar = await barPromise;
  • await命令只能用在async函数之中,如果用在普通函数,就会报错

实例用法

相关文章

  • async await

    文档地址async[http://caibaojian.com/es6/async.html] async函数的语...

  • async/await 整理总结

    参考:红宝书 es6入门 async async 函数的实现原理,就是将 Generator 函数和自动执行器,包...

  • 异步的那些事儿,promise

    promise 是es6 的标准函数,主要是解决执行函数当中的回调问题,相对于async,async只是一套解决回...

  • ES6之async函数

    文章内容转自阮一峰老师博客.语法学习 1.返回 Promise 对象 async函数返回一个Promise 对象。...

  • ES6之async函数

    async函数,类似generator函数都是为了方便于异步操作,而且表现形式也很类似只是将*变成 async...

  • ES6之 async 函数

    1、含义 在ES2017标准中引入了async函数,使得一步操作变得更加方便。那么async函数是什么?一句话,它...

  • JS新特性

    ES ES5 ES6 箭头函数 Promise Symbol属性 Iterator Generator async...

  • ES6 知识点整理

    ES6 包括 变量、函数、数组、json、字符串、面向对象、promise、generator、async/awa...

  • 一次性搞懂 Promise、async await 与 Gene

    学习 ES6 的时候,经常听到 Promise、async await 与 Generator 用来处理异步函数,...

  • ES6 async/await关键字 (上)

    async关键字 在ES6中,声明异步函数很简单,只需要在function前加上async关键字即可,如下: 那怎...

网友评论

      本文标题:ES6之async函数

      本文链接:https://www.haomeiwen.com/subject/yncgsxtx.html