node . js中的异步生成器与异步迭代是什么

  介绍

这篇文章将为大家详细讲解有关节点。js中的异步生成器与异步迭代是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。

前言

生成器函数在JavaScript中的出现早于引入async/等待,这意味着在创建异步生成器(始终返回承诺且可以等待的生成器)的同时,还引入了许多需要注意的事项。

今天,我们将研究异步生成器及其近亲——异步迭代。

注意:尽管这些概念应该适用于所有遵循现代规范的JavaScript,但本文中的所有代码都是针对节点。js 10、12和14版开发和测试的。

异步生成器函数

看一下这个小程序:

//,文件:main.js   const  createGenerator =,函数* (){   ,油品收率& # 39;一个# 39;   ,油品收率& # 39;b # 39;   ,油品收率& # 39;c # 39;   }      const  main =,(),=祝辞,{   ,const  generator =, createGenerator ()   ,for  (const  item  of 发电机),{   ,console.log(项)   ,}   }   main ()

这段代码定义了一个生成器函数,用该函数创建了一个生成器对象,然后用……的循环遍历该生成器对象。相当标准的东西,尽管你绝不会在实际工作中用生成器来处理如此琐碎的事情。如果你不熟悉生成器和……的循环,请看《Javascript生成器》和《ES6的循环和可迭代对象的》这两篇文章。在使用异步生成器之前,你需要对生成器和……的循环有扎实的了解。

假设我们要在生成器函数中使用等待,只要需要用异步关键字声明函数,节点。js就支持这个功能。如果你不熟悉异步函数,那么请看《在现代JavaScript中编写异步任务》一文。

下面修改程序并在生成器中使用等待。

//,文件:main.js   const  createGenerator =, async 函数* (){   ,油品收率await  new 承诺((r),=祝辞,r(& # 39;一个# 39;))   ,油品收率& # 39;b # 39;   ,油品收率& # 39;c # 39;   }      const  main =,(),=祝辞,{   ,const  generator =, createGenerator ()   ,for  (const  item  of 发电机),{   ,console.log(项)   ,}   }   main ()

同样在实际工作中,你也不会这样做,你可能会等待来自第三方API或库的函数。为了能让大家轻松掌握,我们的例子尽量保持简单。

如果尝试运行上述程序,则会遇到问题:

,美元node  main.js/用户/alanstorm/桌面/main.js: 9   ,for  (const  item  of 发电机),{   ,,^   TypeError: generator  is  not  iterable

JavaScript告诉我们这个生成器是“不可迭代的”。乍一看,似乎使生成器函数异步也意味着它生成的生成器是不可迭代的。这有点令人困惑,因为生成器的目的是生成“以编程方式”可迭代的对象。

接下来搞清楚到底发生了什么。

检查生成器

如果你看了JavaScript生成器[1]的可迭代对象。当对象具有一方法时,该对象将实现迭代器协议,并且该一方法返回带属有价值性,做属性之一或同时带有价值和完成属性的对象。

如果用下面这段代码比较异步生成器函数与常规生成器函数返回的生成器对象:

//,文件:test-program.js   const  createGenerator =,函数* (){   ,油品收率& # 39;一个# 39;   ,油品收率& # 39;b # 39;   ,油品收率& # 39;c # 39;   }      const  createAsyncGenerator =, async 函数* (){   ,油品收率await  new 承诺((r),=祝辞,r(& # 39;一个# 39;))   ,油品收率& # 39;b # 39;   ,油品收率& # 39;c # 39;   }      const  main =,(),=祝辞,{   ,const  generator =, createGenerator ()   ,const  asyncGenerator =, createAsyncGenerator ()      ,console.log(& # 39;发电机:& # 39;,发生器[Symbol.iterator])   ,console.log (& # 39; asyncGenerator& # 39;, asyncGenerator [Symbol.iterator])   }   main ()

则会看的到,前者没有符号。迭代器方法,而后者有。

,美元node  test-program.js   发电机:[函数:,[Symbol.iterator]]   asyncGenerator 未定义的

这两个生成器对象都有一个下一个方法。如果修改测试代码来调用这个一方法:

//,文件:test-program.js/*,…*/const  main =,(),=祝辞,{   ,const  generator =, createGenerator ()   ,const  asyncGenerator =, createAsyncGenerator ()      ,console.log(& # 39;发电机:& # 39;,generator.next ())   ,console.log (& # 39; asyncGenerator& # 39;, asyncGenerator.next ())   }   main ()

node . js中的异步生成器与异步迭代是什么