• 主页

  • 投资

  • IT

    🔥
  • 设计

  • 销售

  • 共299篇

    前端 - Javascript

关闭

返回栏目

关闭

返回前端 - Javascript栏目

252 - 异步迭代器 - 异步迭代协议 - 异步迭代器的概念规则

作者:

贺及楼

成为作者

更新日期:2025-02-21 21:06:13

异步迭代器 - 异步迭代协议 - 异步迭代器的概念规则

在 JavaScript 的世界里,异步操作是处理耗时任务(如网络请求、文件读取等)的关键。而异步迭代器和异步迭代协议则为我们处理异步可迭代对象提供了强大的工具。本文将深入探讨异步迭代器、异步迭代协议的概念和规则,并通过实际例子帮助大家更好地理解。

同步迭代回顾

在介绍异步迭代之前,我们先简单回顾一下同步迭代。在 JavaScript 中,同步迭代使用 for...of 循环来遍历可迭代对象。可迭代对象需要实现 Symbol.iterator 方法,该方法返回一个迭代器对象,迭代器对象有一个 next() 方法,每次调用 next() 方法会返回一个包含 valuedone 属性的对象。

  1. const iterable = [1, 2, 3];
  2. const iterator = iterable[Symbol.iterator]();
  3. console.log(iterator.next()); // { value: 1, done: false }
  4. console.log(iterator.next()); // { value: 2, done: false }
  5. console.log(iterator.next()); // { value: 3, done: false }
  6. console.log(iterator.next()); // { value: undefined, done: true }

异步迭代器和异步迭代协议的概念

异步迭代协议

异步迭代协议定义了一种标准的方式来异步地迭代数据。一个对象如果要成为异步可迭代对象,必须实现 Symbol.asyncIterator 方法。这个方法必须返回一个异步迭代器对象。

异步迭代器

异步迭代器是一个对象,它有一个 next() 方法。next() 方法必须返回一个 Promise,这个 Promise 会在解决(resolved)时返回一个对象,该对象包含 valuedone 两个属性,和同步迭代器类似。

  • value:表示当前迭代的值。
  • done:是一个布尔值,true 表示迭代结束,false 表示还有更多的值可以迭代。

异步迭代器的规则

  1. 实现 Symbol.asyncIterator 方法:异步可迭代对象必须有 Symbol.asyncIterator 方法,该方法返回一个异步迭代器。
  2. next() 方法返回 Promise:异步迭代器的 next() 方法必须返回一个 Promise,这个 Promise 解决时返回包含 valuedone 属性的对象。
  3. 迭代结束:当 done 属性为 true 时,迭代结束,此时 value 属性通常为 undefined

实际例子

自定义异步可迭代对象

下面是一个自定义的异步可迭代对象的例子,它模拟了一个异步生成数字的过程。

  1. const asyncIterable = {
  2. [Symbol.asyncIterator]() {
  3. let i = 0;
  4. return {
  5. next() {
  6. const shouldContinue = i < 3;
  7. const nextValue = shouldContinue? i++ : undefined;
  8. return Promise.resolve({
  9. value: nextValue,
  10. done:!shouldContinue
  11. });
  12. }
  13. };
  14. }
  15. };
  16. (async () => {
  17. for await (const num of asyncIterable) {
  18. console.log(num);
  19. }
  20. })();

在这个例子中,asyncIterable 对象实现了 Symbol.asyncIterator 方法,该方法返回一个异步迭代器。异步迭代器的 next() 方法返回一个 Promise,模拟了异步操作。使用 for await...of 循环来异步迭代这个对象。

从 API 获取数据并异步迭代

假设我们有一个 API,每次请求会返回一个数字,我们可以使用异步迭代器来处理这些数据。

  1. // 模拟 API 请求
  2. function fetchNumber() {
  3. return new Promise((resolve) => {
  4. setTimeout(() => {
  5. const randomNumber = Math.floor(Math.random() * 100);
  6. resolve(randomNumber);
  7. }, 500);
  8. });
  9. }
  10. const numberFetcher = {
  11. [Symbol.asyncIterator]() {
  12. let count = 0;
  13. return {
  14. async next() {
  15. if (count < 3) {
  16. const number = await fetchNumber();
  17. count++;
  18. return { value: number, done: false };
  19. }
  20. return { value: undefined, done: true };
  21. }
  22. };
  23. }
  24. };
  25. (async () => {
  26. for await (const num of numberFetcher) {
  27. console.log(num);
  28. }
  29. })();

在这个例子中,numberFetcher 是一个异步可迭代对象,它的 next() 方法会异步地从模拟的 API 获取数据,直到获取了 3 个数字为止。

总结

概念 描述 关键方法 返回值
同步迭代器 用于同步遍历可迭代对象 Symbol.iterator 返回迭代器,迭代器有 next() 方法 { value, done } 对象
异步迭代器 用于异步遍历异步可迭代对象 Symbol.asyncIterator 返回异步迭代器,异步迭代器有 next() 方法 返回 PromisePromise 解决时返回 { value, done } 对象

异步迭代器和异步迭代协议为我们处理异步数据提供了一种优雅的方式,通过实现 Symbol.asyncIterator 方法和 next() 方法,我们可以创建自定义的异步可迭代对象,并使用 for await...of 循环来异步地遍历它们。希望本文能帮助你更好地理解和使用异步迭代器。