异步迭代器
在 ECMAScript 2015 中,迭代器被引入到了 JavaScript 中。迭代器是一个对象,它具有一个 next() 方法,每次调用 next() 方法都会返回一个对象,该对象包含迭代器的下一个值及一个 boolean 类型的 done 属性,表示是否还有更多的值可供迭代。迭代器可以被用在 for-of 循环中,用来遍历数组、字符串和其他可迭代对象。
随着 JavaScript 中异步编程的兴起,异步迭代器被引入到了 ECMAScript 2017 中。异步迭代器是一个对象,它具有一个 Symbol.asyncIterator 属性,该属性是异步迭代器在类似 for-await-of、for-await-in 这样的循环语句中被识别的标记。异步迭代器的 next() 方法返回一个 Promise 对象,该 Promise 对象有一个 value 属性,代表下一个迭代值,以及一个 boolean 类型的 done 属性,表示是否还有更多的值可供迭代。
下面是一个使用异步迭代器遍历异步生成器的示例代码:
-- -------------------- ---- ------- ----- --------- ---------------- - ----- --- --------------- -- ------------- -- ----------- ------- ----- --- --------------- -- ------------- -- ----------- ------- ----- --- --------------- -- ------------- -- ----------- ------- - ----- -------- ------ - --- ----- ------ ----- -- ----------------- - ------------------- -- -- -- - - - -------
在该示例代码中,asyncGenerator() 是一个异步生成器函数,它返回一个异步可迭代对象。main() 函数通过 for-await-of 循环遍历异步生成器生成的异步迭代器,打印出每一个异步值。
for-await-of 循环
for-await-of 循环是 ECMAScript 2017 中新增的一个语句,它用于异步迭代器的遍历。与 for-of 循环不同的是,for-await-of 循环遍历的是异步迭代器,每次迭代都需要等待 Promise 对象的 resolve(),并获取到异步值。如果在遍历过程中出现了错误,for-await-of 循环会调用 Promise 对象的 reject() 方法。
下面是使用 for-await-of 循环遍历异步迭代器的示例代码:
-- -------------------- ---- ------- ----- --------- ---------------- - ----- --- --------------- -- ------------- -- ----------- ------- ----- --- ------------ -- ------------ ----- --- --------------- -- ------------- -- ----------- ------- - ----- -------- ------ - --- - --- ----- ------ ----- -- ----------------- - ------------------- -- - - - ----- ------- - --------------------- -- ------ ----- -- --------- - - -------
在该示例代码中,asyncGenerator() 是一个异步生成器函数,它返回一个异步可迭代对象。for-await-of 循环通过异步迭代器遍历异步生成器生成的异步迭代器,打印出每一个异步值。在异步生成器的第二个 yield 语句之前抛出一个错误,for-await-of 循环通过 catch 语句捕获错误并打印出错误信息。
结论
ECMAScript 2017 中的异步迭代器及 for-await-of 循环语句使得 JavaScript 开发者可以更方便地实现异步迭代操作,从而更好地支持异步编程。通过异步迭代器,我们能够遍历异步生成器生成的异步可迭代对象,从而更好地处理异步任务。通过 for-await-of 循环语句,我们能够更方便地遍历异步迭代器,并更好地处理异步迭代过程中出现的错误。
最后提醒大家,使用异步迭代器时需要注意 await 语句及 Promise 对象的使用,以避免代码中出现死锁。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/670880a3d91dce0dc871ca0e