005 async/await 是什么鬼

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 函数会默认返回一个resultundefinedpromise对象,如果写了return 则返回 return值的promise对象,如

    async function foo () {}
    foo().then(res => console.log(res)) // undefined
    
    async function foo () {
    	return 'success'
    }
    foo().then(res => console.log(res)) // success
    
    1
    2
    3
    4
    5
    6
    7
  • await

    由于 异步函数主要针对不会马上完成的任务,所以需要 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 有什么优势呢?

  1. 内置执行器

    Generator 函数的执行必须靠执行器,所以才有了 co 函数库,而 async 函数自带执行器。也就是说,async 函数的执行,与普通函数一模一样,只要一行

  2. 更好的语义

    async 和 await,比起星号和 yield,语义更清楚了。async 表示函数里有异步操作,await 表示紧跟在后面的表达式需要等待结果

  3. 更广的适用性

    co 函数库约定,yield 命令后面只能是 Thunk 函数或 Promise 对象,而 async 函数的 await 命令后面,可以跟 Promise 对象和原始类型的值(数值、字符串和布尔值,但这时等同于同步操作

Last Updated: 8/4/2021, 6:25:04 PM