async / await 总结
说明
一句话解释: async 函数,就是 Generator 函数的语法糖
1. 建立在 promise 之上。所以,不能把它和回调函数搭配使用。但它会声明一个异步函数,并隐式地返回一个 Promise 。因此可以直接 return 变量,无需使用 Promise.resolve 进行转换
2. 和 promise 一样,是非阻塞的。但不用写 then 及其回调函数,这减少代码行数,也避免了代码嵌套。而且,所有异步调用,可以写在同一个代码块中,无需定义多余的中间变量
3. 它的最大价值在于,可以使异步代码,在形式上,更接近于同步代码
4. 它总是与 await 一起使用的。并且, await 只能在 async 函数体内
5.await 是个运算符,用于组成表达式,它会阻塞后面的代码。如果等到的是 Promise 对象,则得到其 resolve 值。否则,会得到一个表达式的运算结果
一个简单的例子
const doSomethingAsync = () => { return new Promise((resolve) => { setTimeout(() => resolve('I did something'), 3000) }) } const doSomething = async () => { console.log(await doSomethingAsync()) } console.log('Before') doSomething() console.log('After')
一切都是 promise
将 async 关键字添加到任何函数,意味着该函数将返回一个 Promise
const aFunction = async () => { return 'test' } aFunction().then(alert) // This will alert 'test'
并且与下面的代码等价:
const aFunction = async () => { return Promise.resolve('test') } aFunction().then(alert) // This will alert 'test'
代码更易于阅读
每一个步骤都需要之前每个步骤的结果
const getFirstUserData = () => { return fetch('/users.json') // get users list .then(response => response.json()) // parse JSON .then(users => users[0]) // pick first user .then(user => fetch(`/users/${user.name}`)) // get user data .then(userResponse => response.json()) // parse JSON } getFirstUserData()
并且与下面的代码等价:
const getFirstUserData = async () => { const response = await fetch('/users.json') // get users list const users = await response.json() // parse JSON const user = users[0] // pick first user const userResponse = await fetch(`/users/${user.name}`) // get user data const userData = await user.json() // parse JSON return userData } getFirstUserData()
async / await 中的错误处理
async 中的错误处理
因为 async 的返回值也是个 promise ,跟 promise 的错误处理差不多。此外, async 里面 throw Error 相当于返回 Promise.reject
async function F(){ throw new Error('test1') } var f=F(); f.catch(function(e){console.log(e)}); // Error:test1
await 中的错误处理
在 async 中, await 的错误相当于 Promise.reject
async function F(){ await Promise.reject('Error test1').catch(function(e){ console.log(e) }) } var f=F(); // Error:test1
await 中的 promise.reject 必须要被捕获
await 如果返回的是 reject 状态的 promise ,如果不被捕获,就会中断 async 函数的执行
async function F(){ await Promise.reject('Error test1'); await 2 } var f=F()
上述代码中,前面的 Promise.reject 没有被捕获,所以不会执行 await 2