await 是 async wait 的简写, 是 generator 函数的语法糖。

async 函数的特点:

  • async 声明一个方法是异步的,await 则等待这个异步方法执行的完成
asyncReadFile = async function () {
var f1 = await readFile('/etc/fstab')
var f2 = await readFile('/etc/shells')
console.log(f1.toString())
console.log(f2.toString())
}
  • await 只能出现在 async 函数中, 用在 async 外或者普通函数内都会报错
function getDay () {
return new Date().getDay()
}
const today = await getDay ()
// Uncaught SyntaxError: Unexpected identifier
  • async函数返回一个 Promise 对象,如果在函数中 return 一个直接量,async 会把这个直接量通过 Promise.resolve() 封装成 Promise 对象
async function getName () {
return 'wangxi'
}
getName()
// Promise {[[PromiseStatus]]: "resolved", [[PromiseValue]]: "wangxi"}
  • async函数内部return语句返回的值,会成为then方法回调函数的参数
async function getName () {
return 'wangxi'
}
getName().then(value => console.log(value))
// wangxi
  • 只要一个await语句后面的 Promise 变为reject,那么整个async函数都会中断执行
async function f() {
await Promise.reject('出错了')
await Promise.resolve('hello world') // 不会执行
}
f()
// VM259:4 Uncaught (in promise) 出错了 
  • 如果希望前一个异步操作失败但不会影响后面的异步操作继续进行,可以将前面的 await 放在 try...catch 结构里面(如果有多个 await ,则需要将每一个 await 都放在 try...catch 中)
async function f() {
try {
await Promise.reject('出错了')
} catch(e) {
}
return await Promise.resolve('hello world')
}
f().then(v => console.log(v)) 

或者在 await 后面的 Promise 对象加一个 catch 方法来处理错误

async function f() {
await Promise.reject('出错了').catch(e => console.log(e))
await Promise.reject('又出错了').catch(e => console.log(e))
return await Promise.resolve('hello world')
}
f().then(v => console.log(v))
// 出错了
// 又出错了
// hello world
  • 如果多个异步操作不存在继发关系,则可以使用 Promise.all 同时触发异步操作
async function f () {
// 先后,先执行 getName() 再执行 getAge()
const name = await getName()
const age = await getAge()
console.log(name, wangxi) // wangxi 25
// 同时触发
let [name1, age1] = await Promise.all([getName(), getAge()])
console.log(name1, age1) // wangxi 25
}

参考:http://es6.ruanyifeng.com/#docs/async

ES6学习笔记(四)—— async 函数的更多相关文章

  1. ES6学习笔记<四> default、rest、Multi-line Strings

    default 参数默认值 在实际开发 有时需要给一些参数默认值. 在ES6之前一般都这么处理参数默认值 function add(val_1,val_2){ val_1 = val_1 || 10; ...

  2. ES6学习笔记<三> 生成器函数与yield

    为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...

  3. Python学习笔记(四)Python函数的参数

    Python的函数除了正常使用的必选参数外,还可以使用默认参数.可变参数和关键字参数. 默认参数 基本使用 默认参数就是可以给特定的参数设置一个默认值,调用函数时,有默认值得参数可以不进行赋值,如: ...

  4. es6学习笔记10--箭头函数

    基本用法 ES6允许使用“箭头”(=>)定义函数. var f = v => v; 上面的箭头函数等同于: var f = function(v) { return v; }; 如果箭头函 ...

  5. ES6学习笔记四:Proxy与Reflect

    一:Proxy 代理. ES6把代理模式做成了一个类,直接传入被代理对象.代理函数,即可创建一个代理对象,然后我们使用代理对象进行方法调用,即可调用被包装过的方法: 1)创建 var proxy = ...

  6. ES6学习笔记四(类和对象)

    { // 构造函数和实例 class Parent{ constructor(name='mukewan'){ this.name=name; } } let v_parent=new Parent( ...

  7. scala 学习笔记四 匿名函数

    1.介绍 Scala 中定义匿名函数的语法很简单,箭头左边是参数列表,右边是函数体. 使用匿名函数后,我们的代码变得更简洁了. 下面的表达式就定义了一个接受一个Int类型输入参数的匿名函数: var ...

  8. ES6学习笔记<二>arrow functions 箭头函数、template string、destructuring

    接着上一篇的说. arrow functions 箭头函数 => 更便捷的函数声明 document.getElementById("click_1").onclick = ...

  9. ES6学习笔记<五> Module的操作——import、export、as

    import export 这两个家伙对应的就是es6自己的 module功能. 我们之前写的Javascript一直都没有模块化的体系,无法将一个庞大的js工程拆分成一个个功能相对独立但相互依赖的小 ...

  10. ES6学习笔记<一> let const class extends super

    学习参考地址1  学习参考地址2 ECMAScript 6(以下简称ES6)是JavaScript语言的下一代标准.因为当前版本的ES6是在2015年发布的,所以又称ECMAScript 2015:也 ...

随机推荐

  1. python2.7练习小例子(二十五)

        25):题目:有5个人坐在一起,问第五个人多少岁?他说比第4个人大2岁.问第4个人岁数,他说比第3个人大2岁.问第三个人,又说比第2人大两岁.问第2个人,说比第一个人大两岁.最后问第一个人,他 ...

  2. Hibernate-ORM:14.Hibernate中的命名查询

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 本篇博客讲述命名查询,所谓命名查询是什么呢? Hibernate中允许我们在xml,实体类,甚至注解的方式来编 ...

  3. vue3.0 部署的基础流程

    1.创建vue.config.js 主要是负责做设置的 2.修改vue.config.js 参考官方说明: 注意:对于本地开发的同学要注意,你之前在处理网络请求时是在8080端口下请求,现在如果换成了 ...

  4. vue之vue-cookies使用

    一.安装vue-cookies npm install --save vue-cookies 或者 yarn add vue-cookies 二.引入vue-cookie // 方式一:require ...

  5. C++学习005-循环

    C++在循环方面,感觉个C没有身边么区别 while循环 for循环 do while循环 其实 使用Goto也可以写个循环 编写环境vs2015 1. while循环 int main() { in ...

  6. 虚拟现实-VR-UE4-认识UE4

    VR的火热,让每个人都想参与一下, 公司在展会上面搞了一个VR的Demo,关注度超出预期,使得公司高层决定来个VR项目 所以 关于UE4 百度百科地址:http://baike.baidu.com/l ...

  7. QC的使用学习(二)

    今日学习清单: 1.Quality  Center中左上角选项中(QC 10.0中文版)工具菜单下的自定义中的几个内容,有:用户属性.组.项目用户.模块访问.需求类型.项目列表等.用户属性打开后是对当 ...

  8. Linux SPI总线和设备驱动架构之四:SPI数据传输的队列化

    我们知道,SPI数据传输可以有两种方式:同步方式和异步方式.所谓同步方式是指数据传输的发起者必须等待本次传输的结束,期间不能做其它事情,用代码来解释就是,调用传输的函数后,直到数据传输完成,函数才会返 ...

  9. 远程sql数据库连接不上,provider: 命名管道提供程序, error: 40 - 无法打开到 SQL Server 的连接 错误解决

    错误信息: “ 标题: 连接到服务器------------------------------ 无法连接到 192.168.1.20. ------------------------------其 ...

  10. web相关基础知识4

      一.定位的盒子居中 Css可见性 overflow: hidden;   溢出隐藏   常用在超出盒子之后就隐藏 visibility: hidden;   隐藏元素    隐藏之后还占据原来的位 ...