本文是笔者阅读MDN:async和await:让异步编程更简单和阮一峰老师的博客之后的学习笔记,如有疑问,欢迎讨论
async functions 和 await 关键字是最近添加到JavaScript语言里面的。它们是ECMAScript 2017 JavaScript版的一部分(参见ECMAScript Next support in Mozilla)。简单来说,它们是基于promises的语法糖,使异步代码更易于编写和阅读。通过使用它们,异步代码看起来更像是老式同步代码,因此它们非常值得学习。
1. async、await关键字
Ⅰ. async
async关键字位于一个函数声明之前,可以将一个函数转换成异步函数:
function hello() {
return "Hello" }
console.log(hello())
async function helloWithAsync() {
return "Hello" }
console.log(helloWithAsync())
输出:
Hello
Promise {
'HelloWithAsync' }
当一个函数申明前加上async之后,调用函数会返回一个promise,而这就是异步函数的特征之一——它保证了函数返回值为promise
如果一个函数本身就返回的是一个promise,那么加上async之后有什么区别呢?
let pro = new Promise((resolve,reject)=>{
resolve('OK')
})
async function doSomething(promise){
let pro = promise
return pro
}
console.log(pro == doSomething(pro))
输出:
false
打印一下pro和doSomething(pro):
console.log(pro)
console.log(doSomething(pro))
输出:
Promise {
'OK' }
Promise {
<pending> }
不难想到,async对返回的pro再进行了一次promise封装
doSomething(pro).then(value=>console.log(value))
输出:
OK
由此可见,async封装的promise和pro具有相同的值。
Ⅱ. await
await 操作符用于