005 async/await 是什么鬼
CENSWIN 7/22/2021 Javascript
# 概念
async/await 是在ES8规范新增的, 这个特性从行为和语法上都增强了 Generator,或者说是 Generator 的一个语法糖,async/await 旨在解决利用异步结构组织代码的问题。
async
async用于声明异步函数, 可以是 函数声明、函数表达式、箭头函数async function foo () {} const bar = async function () {} const baz = () => {}1
2
3需要注意的是 async 函数会默认返回一个
result为undefined的promise对象,如果写了return则返回return值的promise对象,如async function foo () {} foo().then(res => console.log(res)) // undefined async function foo () { return 'success' } foo().then(res => console.log(res)) // success1
2
3
4
5
6
7await
由于 异步函数主要针对不会马上完成的任务,所以需要
await暂停等待解决, 这个原理和 yield 一样async function foo () { const res = await fetch('https://jsonplaceholder.typicode.com/todos/1').then(res=>res.json()) return res } foo().then(res => console.log(res)) // data...1
2
3
4
5
其实整个思路与内置CO函数的Generator 函数完全一致
# 特点
async/await 比 Generator/CO 有什么优势呢?
内置执行器
Generator 函数的执行必须靠执行器,所以才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行
更好的语义
async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果
更广的适用性
co 函数库约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以跟 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作