Async function 在 2017 年已到达了 stage 4。

async/await 使用注意点

  • 为了不让程序挂掉, 注意捕获错误
    写法 1: 用 try/catch 捕获

    1. async function test1() {
    2. try {
    3. await Promise.reject(new Error('boom'))
    4. } catch(e) {
    5. console.log(e)
    6. }
    7. console.log('go on')
    8. }
    9. test1()
    10. // Error: boom
    11. // go on

    写法 2: 直接在 await 后面的 promise 上进行 catch

    1. async function test2() {
    2. await Promise.reject(new Error('boom')).catch(e => console.log(e))
    3. console.log('go on')
    4. }
    5. test2()
    6. // Error: boom
    7. // go on
  • 使用并行提高程序的运行速度

    1. // 串行调用示范
    2. async function block() {
    3. const result1 = await request(url1)
    4. const result2 = await request(url2)
    5. }

    在如上案例中, request(url1) 请求未完成的话是不会发起 request(url2) 请求的(类似串行调用), 若想使之变为并行调用可以作如下修改:
    写法1:

    1. async function block() {
    2. const promise1 = request(url1)
    3. const promise2 = request(url2)
    4. const result1 = await promise1
    5. const result2 = await promise2
    6. }

    写法2:

    1. async function block() {
    2. const [result1, result2] = await Promise.all([request(url1), request(url2)])
    3. }

    async 函数的实现原理

    1. async function fn {}

    async 函数在低版本浏览器中其实就是转为 co + Generator

    1. function fn {
    2. return co(function* () {
    3. })
    4. }

    关于简版 co, 可以看在 Generator 函数的异步应用 的实现。

    异步遍历器

    proposal-async-iteration, 异步遍历器也已经到了 stage 4。

    异步迭代器

    同步场景下可以通过如下获取 valuedone:

    1. const { value, done } = syncIterator.next()

    异步场景下可以通过如下方式获取 valuedone

    1. asyncIterator.next().then({ value, done } => {})

    for await .. of

    1. for await (const line of readLines(filePath)) {
    2. console.log(line)
    3. }