Async Await

注意:你不能在 TypeScript 中以有意义的方式使用 async await(ES5 的转换器正在进行中)。然而这将会很快改变,所以我们仍然有这一章。

作为一个思想实验,想像下面这段代码,这是一种方式去告诉 JavaScript 运行时在使用于 promise 上的 await 关键字上暂停执行代码,然后仅当(和如果)promise 从函数中返回时恢复执行。

// 非真实代码,一个思想实验
async function foo() {
    try {
        var val = await getMeAPromise();
        console.log(val);
    }
    catch(err) {
        console.log('Error: ', err.message);
    }
}

当 promise 稳定后执行继续,

  • 如果它是 fulfilled,那么 await 会返回值,
  • 如果它 reject 了一个错误,那么错误会被同步地抛出使我们可以捕获。

这突然(而且神奇地)令异步编程跟同步编程一样容易。这个思想实验需要三样东西:

  • 暂停函数执行的能力。
  • 把值放入函数中的能力。
  • 把错误抛到函数中的能力。

这正是 generators 帮我们做到的事!这个思想实验实际上是真实的,而且就是 TypeScript / JavaScript 中 async/await 的实现。背后它实际上只使用了 generators。

生成的 JavaScript

你不需要去理解它,但如果你已经读了 generators,就相当简单了。函数 foo 可以简单地被包裹为:

const foo = wrapToReturnPromise(function* () {
    try {
        var val = yield getMeAPromise();
        console.log(val);
    }
    catch(err) {
        console.log('Error: ', err.message);
    }
})

wrapToReturnPromise 只是执行了 generator 函数来获得 generator 然后使用 generator.next(),如果值是一个 promise,它会 then+catch 这个 promise,以及取决于结果来调用 genertor.next(result) 或者 genertor.throw(error)。就是这样!

results matching ""

    No results matching ""