【译】ES建议:async函数
Async
函数是Brian Terlson
提出的ECMAScript提案
,目前处于stage 3(candidate 候选)
阶段。
| 译者注:ECMAScript提案分三个阶段:草图(Sketch) -> 提案(Proposal) -> 规范(Standard),所以Async
很大的希望能成为规范.
在开始解释async
函数之前,我想先讲一下如何通过组合Promises
和generators
用看起来同步的代码来控制异步操作。
通过 Promises 和 generators 写异步代码
在众多的能用于异步的函数中,Promises
,作为ES6
的一部分,变得越来越受欢迎。一个例子就是客户端的fetch API
,用来发送请求获取数据从而替代XMLHttpRequest
。使用fetch
看起来像下面这样:
function fetchJson(url) { |
co库通过使用Promises
和generators
能让代码看起来更同步,上面的例子用co
来写就是下面这样子:
const fetchJson = co.wrap(function* (url) { |
每一次回调(一个generator
函数)都会传递一个Promises
给到co
,然后回调进入暂停状态。一旦Promise
执行完毕,co
就会触发回调:如果Promise
返回fulfilled(成功)
,yield
返回成功状态的值,如果返回rejected(失败)
,yield
就会抛出失败的错误。另外,co
会将返回的回调包装成一个Promise
(跟then()
的用途一样)。
Async 函数
上面的例子用Async
函数的基本用法实现如下:
async function fetchJson(url) { |
在实现上,async
函数更像generators
,但是不会转换成generatos
函数.
Internally, async functions work much like generators, but they are not translated to generator functions.
Async 函数其他的一些用法
现在存在如下的async
函数的变体:
- Async 函数声明:
async function foo() {}
- Async 函数表达式:
const foo = async function() {}
- Async 方法定义:
let obj = { async foo() {} }
- Async 箭头函数:
const foo = async () => {};
深入阅读
Async Functions(Brian Terlson)
Simplifying asynchronous computations via generators(“Exploring ES6”的章节)