关于async/await的一些原理和用法,阮一锋老师的博客已经讲得很清楚了,下面做一些个人的总结:
- async是function的修饰符,表示函数里面有异步操作。用async修饰函数后,函数的return值会自动被Promise.resolve()包裹,比如
async function getAsyncValue() {
let kkm = await getvalue()
return kkm + 1 // 相当于 return Promise.resolve(kkm + 1)
}
如果希望返回reject,用如下写法即可
async function getAsyncValue() {
let kkm = await getvalue()
return Promise.reject('有错误')
}
-
await
只能放到有async
修饰的函数里面使用,表示后面的表达式是异步的,需要等待结果,直到获取到结果了才执行await
下面的表达式。关于await
有两点要注意的地方
-
await
只能放在async
函数的根作用域async function forExam() { let arr = [1, 3] arr.forEach(item => { await getvalue(item) // 这样是不行的,await不在forExam函数的根作用域 }) ... }
-
await
是在等待一个Promise
的异步返回// 错误示例 const demo = async () => { let result = await setTimeout(() => { console.log('抽一秒钟的烟') }, 1000) console.log('抽好了') } demo().then(result => { console.log('出发', result) }) /* 抽好了 出发 undefined 抽一秒钟的烟 */
// 正确示例 const demo = async () => { let result = await new Promise(resolve => { setTimeout(() => { console.log('抽一秒钟的烟') resolve() }, 1000) }) console.log('抽好了') return '坐灰机' } demo().then(result => { console.log('出发', result) }) /* 抽一秒钟的烟 抽好了 出发 坐灰机 */
如上所述,
await
是等待一个Promise
返回,那么就有可能是reject
,所以在使用await
过程中,最好使用try .. catch
包裹await
,来捕获异常我理解的
async/await
的出现是为了让我们更方便简洁地使用Promise
,并不能完全替代Promise
的使用。在一些特殊场景,仍然需要用到Promise.all
和Promise.race