广告
返回顶部
首页 > 资讯 > 前端开发 > html >Node.js 中异步迭代器如何使用
  • 791
分享到

Node.js 中异步迭代器如何使用

2024-04-02 19:04:59 791人浏览 薄情痞子
摘要

这篇文章将为大家详细讲解有关node.js 中异步迭代器如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是异步迭代器异步迭代器实际上是以前迭代器的

这篇文章将为大家详细讲解有关node.js 中异步迭代器如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。

什么是异步迭代器

异步迭代器实际上是以前迭代器的异步版本。当我们不知道迭代的值和最终状态时,可以使用异步迭代器。两者不同的地方在于,我们得到的  promise 最终将被分解为普通的 { value: any, done: boolean } 对象,另外可以通过 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 解析之后再继续执行下一个。

除了流之外,还在还没有什么能够支持异步迭代的结构,但是可以将 asyncIterator 符号手动添加到任何一种可迭代的结构中。

在流上使用异步迭代器

异步迭代器在处理流时非常有用。可读流、可写流、双工流和转换流上都带有 asyncIterator 符号。

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);   } }

如果以这种方式写代码,就不需要在通过迭代获取每个数据块时监听 end 和 data 事件了,并且 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;         }              // 处理响应没有响应体的情况         if (!body) resolve({});   // 需要解析正文来获取 JSON,因为它是一个字符串         const result = jsON.parse(body);         resolve(result);       } catch(error) {         reject(error)       }     });      await req;     req.end();   }); }

代码通过向 Cat api(https://thecatapi.com/)发出请求,来获取一些猫的图片。另外还添加了 7 秒钟的延迟防止对 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;       // 5 页后停止       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);       // 每次请求之间等待 7 秒       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); }

关于Node.js 中异步迭代器如何使用就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

--结束END--

本文标题: Node.js 中异步迭代器如何使用

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

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

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

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

下载Word文档
猜你喜欢
  • Node.js 中异步迭代器如何使用
    这篇文章将为大家详细讲解有关Node.js 中异步迭代器如何使用,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。什么是异步迭代器异步迭代器实际上是以前迭代器的...
    99+
    2022-10-19
  • Node.js 中如何使用异步迭代器
    这期内容当中小编将会给大家带来有关Node.js 中如何使用异步迭代器,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。在 Events 中使用 asyncIteratorN...
    99+
    2022-10-19
  • Node.js中异步迭代器怎么使用
    这篇文章主要介绍了Node.js中异步迭代器怎么使用,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是异步迭代器异步迭代器实际上是以前迭代器的异步版本。当我们不知道迭代的值...
    99+
    2023-06-14
  • 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异步
  • Python异步之迭代器怎么使用
    这篇文章主要介绍“Python异步之迭代器怎么使用”,在日常操作中,相信很多人在Python异步之迭代器怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Python异步之迭代器怎么使用”的疑惑有所帮助!...
    99+
    2023-07-05
  • 详解nodejs中的异步迭代器
    目录前言什么是异步迭代器作为异步迭代器流调用有分页功能的 API前言 从 Node.jsv10.0.0 开始,异步迭代器就出现中了,最近它们在社区中的吸引力越来越大。在本文中,我们将...
    99+
    2022-11-12
  • C#中如何使用迭代器
    今天就跟大家聊聊有关C#中如何使用迭代器,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。创建迭代器最常用的方法是对 IEnumerable 接口实现 GetEnumerator 方法,...
    99+
    2023-06-18
  • C++中如何使用迭代器
    本篇文章给大家分享的是有关C++中如何使用迭代器,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。标准库为每一种标准容器(包括 vector)定义了一种迭代器类型。迭代器类型提供了...
    99+
    2023-06-17
  • 如何使用迭代器
    本篇内容介绍了“如何使用迭代器”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!阅读下面这段代码,请写出这段代...
    99+
    2022-10-19
  • python如何使用迭代器
    小编给大家分享一下python如何使用迭代器,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!迭代器(切片)如果对返回一个对象进行简单的操作,会提示生成对象下的“Ty...
    99+
    2023-06-27
  • Python迭代器如何使用
    这篇文章主要讲解了“Python迭代器如何使用”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Python迭代器如何使用”吧!Python 迭代器迭代器是一种对象,该对象包含值的可计数数字。迭...
    99+
    2023-07-05
  • Node.js中如何使用异步Generator函数
    本篇文章给大家分享的是有关Node.js中如何使用异步Generator函数,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。HTTP 框架分类首...
    99+
    2022-10-19
  • 如何使用迭代器模式
    这篇文章主要讲解了“如何使用迭代器模式”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何使用迭代器模式”吧!你将学到迭代器模式的含义实现一个数组迭代器实现一...
    99+
    2022-10-19
  • 如何在PHP中使用迭代器模式
    这篇文章给大家介绍如何在PHP中使用迭代器模式,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。php的框架有哪些php的框架:1、Laravel,Laravel是一款免费并且开源的PHP应用框架。2、Phalcon,Ph...
    99+
    2023-06-14
  • 如何在java项目中使用迭代器
    如何在java项目中使用迭代器?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。 迭代器模式将一个集合给封装起来,主要是为用户提供了一种遍历其内部元素的方式。迭代器模式有...
    99+
    2023-05-31
    java 迭代器 ava
  • node.js中如何使用async异步控制工具
    node.js中如何使用async异步控制工具,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。这两个操作中,第一个异步的程序我们可能会写成这...
    99+
    2022-10-19
  • Python迭代器如何创建使用
    这篇文章主要介绍“Python迭代器如何创建使用”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Python迭代器如何创建使用”文章能帮助大家解决问题。Python 迭代器迭代器是一种对象,该对象包含...
    99+
    2023-07-06
  • Iterator迭代器如何在Java项目中使用
    Iterator迭代器如何在Java项目中使用?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。什么是迭代器  在Java中,有很多的数据容器,对于这些的操作有很多的共性。Java...
    99+
    2023-05-31
    java iterator ava
  • Qt的遍历迭代器如何使用
    今天小编给大家分享一下Qt的遍历迭代器如何使用的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。前言:Qt(官方发音 [kju:...
    99+
    2023-06-29
软考高级职称资格查询
推荐阅读
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作