简介

JavaScript ES7 中的 async / await 让多个异步 promise 协同工作起来更容易。如果要按一定顺序从多个数据库或者 API 异步获取数据,你可能会以一堆乱七八糟的 promise 和回调函数而告终。而 async / await 结构让我们能用可读性强、易维护的代码更加简洁地实现这些逻辑。

promises

在 JavaScript 中,promise 代表非阻塞异步执行的抽象概念。

promise 一般用于网络 和 I/O操作,比如读取文件,或创建http请求。我们可以创建异步promise,然后用then 添加一个回调函数,当promise结束后会触发这个回调函数,而非阻塞住当前的线程,回调函数本身也可以返回一个promise对象,所以我们能够用链式调用promise。

只用一个 promise 很容易搞定。但是,当需要针对复杂异步逻辑编程时,我们很可能最后要同时用好几个 promise 对象。写一堆 then 语句和匿名回调很容易搞得难以控制。

Async 方法

Async 是定义返回 promise 对象函数的快捷方法。

例如,下面这两种定义是等价的:

function f() {
return Promise.resolve('TEST');
}
// asyncF 和 f 是等价的
async function asyncF() {
return 'TEST';
}

类似地,抛出异常的 async 方法等价于返回拒绝 promise 的方法:

function f() {
return Promise.reject('Error');
}
// asyncF 和 f 是等价的
async function asyncF() {
throw 'Error';
}

Await

只能被用在 async 方法中,让我们能同步等待 promise 执行完。如果在 async 函数外使用 promise, 我们仍然需要用 then 回调函数

eg:

async function f(){
// response 就是 promise 执行成功的值
const response = await rp('http://example.com/');
console.log(response);
}
// 不能在 async 方法外面用 await
// 需要使用 then 回调函数……
f().then(() => console.log('Finished'));

实际上,async / await 在底层转换成了 promise 和 then 回调函数。也就是说,这是使用 promise 的语法糖。每次我们使用 await, 解释器都创建一个 promise 对象,然后把剩下的 async 函数中的操作放到 then 回调函数中。

错误处理

在 promise 上使用 await 会返回值。如果我们进行 await 的 promise 失败了,async 函数就会发生异常。我们可以用标准的 try / catch 来处理这种情况

async function f() {
try {
const promiseResult = await Promise.reject('Error');
} catch (e){
console.log(e);
}
}
 

总结

Async / await 结构是让使用 promise 更简练的语法糖。每一个 async / await 结构都可以写成普通 promise. 归根结底,这是一个编码风格和简洁的问题。

最新文章

  1. 用wireshark抓包分析TCP三次握手、四次挥手以及TCP实现可靠传输的机制
  2. IIS、SQL SERVER和VS的安装顺序
  3. JavaScript DOM高级程序设计 3.6 实例 将HTML代码转换成DOM代码(附源码)--我要坚持到底!
  4. Course Schedule 解答
  5. Lodop简答问答大全
  6. 7.6 chcount.c -- 使用逻辑与运算符
  7. 将Long类型字节大小数据转换成标准的视频大小格式
  8. 操作系统-进程通信(信号量、匿名管道、命名管道、Socket)
  9. js中json对象数组按对象属性排序(sort方法)---2(根据拼音排序汉字和排序英文)
  10. Java 基础之--注解Annotation详解
  11. sencha touch 百度地图扩展(2014-12-17)
  12. holiday
  13. Chrome浏览器录屏扩展插件
  14. SaaS模式介绍
  15. 14款优秀的JavaScript调试工具大盘点
  16. jq 获取name值一样的数组
  17. 布隆过滤器redis缓存
  18. MFC-TCP连接代码片段(支援大富的)
  19. 20155201 2016-2017-2 《Java程序设计》第四周学习总结
  20. Struts2 ongl内存结构

热门文章

  1. Linq之旅:Linq入门详解(Linq to Objects)(转)
  2. java:LeakFilling(Servlet,JSP)
  3. 哈希表 HashTable(又名散列表)
  4. Java程序设计——不一样的开始 IP地址判定
  5. 磁盘的分区和挂载(mount)
  6. Linux 下面根据端口号 查询 可执行程序的路劲的方法
  7. spark 运行报错:java.lang.AbstractMethodError
  8. 【校内test】桶哥的问题
  9. BZOJ 1257 余数之和 题解
  10. laravel5.5学习2-路由系统