广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >详解nodejs中的异步迭代器
  • 372
分享到

详解nodejs中的异步迭代器

2024-04-02 19:04:59 372人浏览 安东尼
摘要

目录前言什么是异步迭代器作为异步迭代器流调用有分页功能的 api前言 从 node.jsv10.0.0 开始,异步迭代器就出现中了,最近它们在社区中的吸引力越来越大。在本文中,我们将

前言

node.jsv10.0.0 开始,异步迭代器就出现中了,最近它们在社区中的吸引力越来越大。在本文中,我们将讨论异步迭代器的作用,还将解决它们可能用于什么目的的问题。

什么是异步迭代器

那么什么是异步迭代器?它们实际上是以前可用的迭代器的异步版本。当我们不知道迭代的值和最终状态时,可以使用异步迭代器,最终我们得到可以解决{value:any,done:boolean}对象的 promise。我们还获得了 for-await-of 循环,以帮助我们循环异步迭代器。就像 for-of 循环是针对同步迭代器一样。


const asyncIterable = [1, 2, 3];
asyncIterable[Symbol.asyncIterator] = async function*() {
  for (let i = 0; i < asyncIterable.length; i++) {
    yield { value: asyncIterable[i], done: false }
  }
  yield { done: true };
};

(async function() {
  for await (const part of asyncIterable) {
    console.log(part);
  }
})();

与常规的 for-of 循环相反,for-await-of 循环将会 等待它收到的每个 promise 解析后再继续执行下一个。

除了流,当前没有太多支持异步迭代的结构,但是可以将符号手动添加到任何可迭代的结构中,如此处所示。

作为异步迭代器流

异步迭代器在处理流时非常有用。可读流、可写流、双工流和转换流都支持异步迭代器。


async function printFileToConsole(path) {
  try {
    const readStream = fs.createReadStream(path, { encoding: 'utf-8' });

    for await (const chunk of readStream) {
      console.log(chunk);
    }

    console.log('EOF');
  } catch(error) {
    console.log(error);
  }
}

如果以这种方式编写代码,则不必通过迭代来获取每个数据块时监听data和end事件,并且 for-await-of 循环随着流本身结束而结束。

调用有分页功能的 API

你还可以用异步迭代从使用分页的源中轻松获取数据。为此,我们还需要一种从 node https 请求方法提供给我们的流中重构响应主体的方法。也可以在这里使用异步迭代器,因为 Https 请求和响应是 Node 中的流:


const https = require('https');

function homebrewFetch(url) {
  return new Promise(async (resolve, reject) => {
    const req = https.get(url, async function(res) {
      if (res.statusCode >= 400) {
        return reject(new Error(`HTTP Status: ${res.statusCode}`));
      }

      try {
        let body = '';

        
        for await (const chunk of res) {
          body += chunk;
        }
    
        // 处理没有 body 的情况
        if (!body) resolve({});
        // 我们需要解析正文以获取 JSON,因为它是一个字符串
        const result = jsON.parse(body);
        resolve(result);
      } catch(error) {
        reject(error)
      }
    });

    await req;
    req.end();
  });
}

我们将向Cat API发出请求,以 10 张为一组获取一些猫的图片。我们还将在请求之间添加 7 秒的延迟,最大页面数为5,以避免导致 cat API 过载。

我们还将在请求和最大页数之间添加 7 秒钟的延迟5个以避免猫cat API重载,因为那将是灾难性的。


function fetchCatPics({ limit, page, done }) {
  return homebrewFetch(`https://api.thecatapi.com/v1/images/search?limit=${limit}&page=${page}&order=DESC`)
    .then(body => ({ value: body, done }));
}

function catPics({ limit }) {
  return {
    [Symbol.asyncIterator]: async function*() {
      let currentPage = 0;
      // Stop after 5 pages
      while(currentPage < 5) {
        try {
          const cats = await fetchCatPics({ currentPage, limit, done: false });
          console.log(`Fetched ${limit} cats`);
          yield cats;
          currentPage ++;
        } catch(error) {
          console.log('There has been an error fetching all the cats!');
          console.log(error);
        }
      }
    }
  };
}

(async function() {
  try {
    for await (let catPicPage of catPics({ limit: 10 })) {
      console.log(catPicPage);
      // Wait for 7 seconds between requests
      await new Promise(resolve => setTimeout(resolve, 7000));
    }
  } catch(error) {
    console.log(error);
  }
})()

这样,我们就会每隔 7 秒钟自动取回一整页的猫图片,以供欣赏。

一种更常见的在页面之间导航的方法是实现next和previous方法并将它们公开为控件:


function actualCatPics({ limit }) {
  return {
    [Symbol.asyncIterator]: () => {
      let page = 0;
      return {
        next: function() {
          page++;
          return fetchCatPics({ page, limit, done: false });
        },
        previous: function() {
          if (page > 0) {
            page--;
            return fetchCatPics({ page, limit, done: false });
          }
          return fetchCatPics({ page: 0, limit, done: true });
        }
      }
    }
  };
}

try {
    const someCatPics = actualCatPics({ limit: 5 });
    const { next, previous } = someCatPics[Symbol.asyncIterator]();
    next().then(console.log);
    next().then(console.log);
    previous().then(console.log);
} catch(error) {
  console.log(error);
}

如你所见,当你要获取数据页面或在应用程序的 UI 上进行无限滚动等操作时,异步迭代器将会非常有用。

这些功能已经在浏览器中使用了一段时间,在 Chrome v63+、 Firefox v57+ 和 Safari v11.1 中可用。但是当前在 IE 和 Edge 中不可用。

以上就是详解nodejs中的异步迭代器的详细内容,更多关于nodejs异步迭代器的资料请关注编程网其它相关文章!

--结束END--

本文标题: 详解nodejs中的异步迭代器

本文链接: https://www.lsjlt.com/news/125335.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 详解nodejs中的异步迭代器
    目录前言什么是异步迭代器作为异步迭代器流调用有分页功能的 API前言 从 Node.jsv10.0.0 开始,异步迭代器就出现中了,最近它们在社区中的吸引力越来越大。在本文中,我们将...
    99+
    2022-11-12
  • PHP8.0中的异步迭代器
    在PHP8.0版本中,加入了新的特性——异步迭代器。这一特性的出现,使得PHP在异步编程方面更为灵活和强大。本文将详细介绍PHP8.0中异步迭代器的定义、作用、使用方式及示例。一、异步迭代器是什么?大多数人都熟悉PHP的迭代器(Iterat...
    99+
    2023-05-14
    PHP 迭代器 异步
  • Python异步之迭代器如何使用详解
    目录正文1. 什么是异步迭代器1.1. Iterators1.2. Asynchronous Iterators2. 什么是“async for”循环?3. ...
    99+
    2023-03-22
    Python异步迭代器 Python异步
  • Javascript的迭代器和迭代接口详解
    目录1,什么是迭代器2,自定义迭代接口3,原生语言的迭代总结1,什么是迭代器 每一个可迭代对象都对应着一个可迭代接口[Symbol.iterator]; [Symbol.iterat...
    99+
    2022-11-13
  • Node.js中异步迭代器怎么使用
    这篇文章主要介绍了Node.js中异步迭代器怎么使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是异步迭代器异步迭代器实际上是以前迭代器的异步版本。当我们不知道迭代的值...
    99+
    2023-06-14
  • Node.js 中异步迭代器如何使用
    这篇文章将为大家详细讲解有关Node.js 中异步迭代器如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是异步迭代器异步迭代器实际上是以前迭代器的...
    99+
    2022-10-19
  • Node.js 中如何使用异步迭代器
    这期内容当中小编将会给大家带来有关Node.js 中如何使用异步迭代器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在 Events 中使用 asyncIteratorN...
    99+
    2022-10-19
  • Java中Iterator(迭代器)的用法详解
    Java迭代器(Iterator)是 Java 集合框架中的一种机制,它提供了一种在不暴露集合内部实现的情况下遍历集合元素的方法。Java Iterator(迭代器)不是一个集合,它...
    99+
    2023-05-19
    Java Iterator迭代器使用 Java Iterator Java 迭代器
  • Java中Iterator迭代器的使用详解
    目录Iterator接口迭代器的实现原理增强for练习1:遍历数组练习2:遍历集合Iterator接口 在程序开发中,经常需要遍历集合中的所有元素。针对这种需求,JDK专门提供了一个...
    99+
    2022-11-13
    Java Iterator迭代器 Java Iterator Java 迭代器
  • 详解ES6 中的迭代器和生成器
    目录1.迭代器2.生成器1.迭代器 Iterator是 ES6 引入的一种新的遍历机制。两个核心 迭代器是一个统一的接口,它的作用是使各种数据结构可以被便捷的访问,它是通过一个键为S...
    99+
    2022-11-13
    ES6 中的迭代器和生成器 ES6 迭代器 ES6生成器
  • Python 的迭代器与zip详解
    目录关于迭代器关于zip总结:首先抛出一个困扰本人许久的问题: nums = [1,2,3,4,5,6] numsIter = iter(nums) for _ in zip(*...
    99+
    2022-11-12
  • python中的生成器、迭代器、装饰器详解
    一、装饰器 由于一个函数能实现一种功能,现在想要在不改变其代码的情况下,让这个函数进化一下,即能保持原来的功能,还能有新的"技能",怎么办? 现已经存在一个自定义...
    99+
    2022-11-11
  • python中的迭代器,生成器与装饰器详解
    目录迭代器生成器装饰器总结迭代器 每一个可迭代类内部都要实现__iter__()方法,返回一个迭代类对象,迭代类对象则定义了这个可迭代类如何迭代。 for循环调用list本质上是是调...
    99+
    2022-11-13
  • Python 中迭代器与生成器实例详解
    Python 中迭代器与生成器实例详解 本文通过针对不同应用场景及其解决方案的方式,总结了Python中迭代器与生成器的一些相关知识,具体如下: 1.手动遍历迭代器 应用场景:想遍历一个可迭代对象中的所...
    99+
    2022-06-04
    生成器 详解 实例
  • C++中vector迭代器失效问题详解
    目录问题: (1)删除vector中所有的偶数(2)vector容器插入元素问题迭代器失效原因解决:总结问题:  (1)删除vector中所有的偶数 #i...
    99+
    2022-11-12
  • 解析Python中的生成器及其与迭代器的差异
    生成器 生成器是一种迭代器,是一种特殊的函数,使用yield操作将函数构造成迭代器。普通的函数有一个入口,有一个返回值;当函数被调用时,从入口开始执行,结束时返回相应的返回值。生成器定义的函数,有多个入口和...
    99+
    2022-06-04
    生成器 差异 迭代
  • Java设计模式中的迭代器模式详解
    目录一 定义二 UML类图三 代码实例四 迭代器模式的优缺点4.1 优点4.2 缺点五 使用场景六 JDK迭代器的运用一 定义 提供一个对象来顺序访问聚合对象中的一系列数据,而不暴露...
    99+
    2023-02-08
    Java迭代器模式 Java设计模式
  • 如何解决nodejs中的异步操作问题
    这篇文章给大家分享的是有关如何解决nodejs中的异步操作问题的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。基本概念:async 表示这是一个async函数,await只能用在这...
    99+
    2022-10-19
  • 带你了解Nodejs中的非阻塞异步IO
    以上就是带你了解Nodejs中的非阻塞异步IO的详细内容,更多请关注编程网其它相关文章!...
    99+
    2023-05-14
    I/O模型 node
  • C/C++迭代器的失效问题详解
    目录前言下面是我今天做的一些代码测试:我们接着往下看下一个出问题的测试代码:迭代器失效总结前言 我今天在使用迭代器时发现了一个问题,这个问题就是我在使用的迭代器时发现莫名其妙的有越界...
    99+
    2022-11-13
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作