详解Node.js异步迭代器及其使用方法


本文摘自PHP中文网,作者青灯夜游,侵删。

本篇文章带大家了解一下Node.js中的异步迭代器。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。

从 10.0.0 版开始,异步迭代器就出现在 Node 中了,在本文中,我们将讨论异步迭代器的作用,以及它们可以用在什么地方。

什么是异步迭代器

异步迭代器实际上是以前迭代器的异步版本。当我们不知道迭代的值和最终状态时,可以使用异步迭代器。两者不同的地方在于,我们得到的 promise 最终将被分解为普通的 { value: any, done: boolean } 对象,另外可以通过 for-await-of 循环来处理异步迭代器。就像 for-of 循环用于同步迭代器一样。【相关推荐:《nodejs 教程》】

1

2

3

4

5

6

7

8

9

10

11

12

13

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 符号。

1

2

3

4

5

6

7

8

9

10

11

12

13

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

  }

}

如果以这种方式写代码,就不需要在通过迭代获取每个数据块时监听 enddata 事件了,并且 for-await-of 循环会随着流的结束而结束。

用于有分页功能的 API

你还可以通过异步迭代从使用分页的源中轻松获取数据。为了实现这个功能,还需要一种从Node https 请求方法提供给的流中重构响应主体的方法。在这里也可以使用异步迭代器,因为 https 请求和响应在 Node 中都是流:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

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 = '';

 

        /*

          代替 res.on 侦听流中的数据,

          可以使用 for-await-of,

          并把数据块附加到到响应体的剩余部分

        */

        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 的访问过与频繁,因为那样是极其不道德的。

阅读剩余部分

相关阅读 >>

node.js使用multer中间件上传文件

如何从node.js发送电子邮件

深入研究node.js中的日志信息

如何使用ppa在ubuntu上安装最新的node.js和npm

深入浅析node.js中的异步

js中object.defineproperty的用法介绍(代码示例)

一文快速了解node.js中的事件循环

如何在macos上安装node.js和npm

了解node.js中的stream

了解node.js中的模块系统

更多相关阅读请进入《node.js》频道 >>




打赏

取消

感谢您的支持,我会继续努力的!

扫码支持
扫码打赏,您说多少就多少

打开支付宝扫一扫,即可进行扫码打赏哦

分享从这里开始,精彩与您同在

评论

管理员已关闭评论功能...

    暂无评论...