在 ECMAScript 2018 (ES9) 中,除了已经成为核心的异步操作工具 Promise
,还新增了一些强大的异步操作工具:Async Function
、 Async Generator Function
和 Async Iterator
。尤其是在处理高级异步操作时,这些工具简化了代码结构,让代码更易读,易维护。
Async Generator Function
ES9 中新增了 Async Generator Function,它是 generator function 在 async 函数中的扩展形式。Async Generator Function 内部每一次 yield 都会成为一个 promise 对象返回,支持 for-await-of
或者 yield*
。
下面是一个 Async Generator Function 的示例:
async function* fetchData() { const data = await fetch('/api/data'); yield await data.json(); }
之后你就可以使用 for await ... of
语句来进行异步迭代操作:
async function printData() { for await (let data of fetchData()) { console.log(data); } }
这就相当于:
async function printData() { const iterator = fetchData(); const { value: data } = await iterator.next(); console.log(data); }
Async Iterator
ES9 也新增了 Async Iterator
定义来支持 for-await-of
,Async Generator Object 自动成为实现 Async Iterator 的对象。Async Iterator 只要实现了 .next()
方法并且返回一个 promise,就可以被 for-await-of
语句使用。
下面是一个 Async Iterator 的示例:
-- -------------------- ---- ------- ----- ------------- - - ------------------------ - --- - - -- ------ - ----- ------ - -- -- - -- - ----- --- --------- -- ------------- ------- ------ - ------ ---- ----- ----- -- - ------ - ----- ---- -- - - - -- ------ ---------- - --- ----- ---- --- -- -------------- - ----------------- - -----
这里定义了一个 asyncIterable 对象,在调用 for-await-of
语句时会自动调用这个对象的 [Symbol.asyncIterator]
方法,方法需要返回一个实现 Async Iterator 的对象。这个对象的 .next()
方法返回一个 promise,代表这个异步操作的执行结果。
结论
ES9 为我们提供了更多的异步操作的选择,为前端开发创造更加可控、简洁的代码结构。要想充分发挥这些特性的优势,需要我们对其深入了解,积极进取、不断研究。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/671c92c19babaf620fb1625d