当前位置: 首页 > 面试题库 >

试图了解node.js中的生成器/ yield-什么执行异步功能?

姚自强
2023-03-14
问题内容

Node.js现在具有生成器。

我的理解是,可以使用生成器来编写看起来更线性的代码,并避免回调地狱和厄运样式编码的金字塔。

因此,到目前为止,我的理解是,在生成器内部,代码将执行直到达到“
yield”语句为止。此时,生成器功能的执行将中止。该yield语句指定一个返回值,该值可以是一个函数。通常,这将是一个阻塞的I / O功能-
通常需要异步执行的功能。

yield的返回函数将返回到任何称为生成器的函数。

我的问题是,此时会发生什么?究竟是什么执行收益率返回的阻塞I / O功能?

编写看起来是线性的生成器/
yield代码是否正确,是否需要一种特定类型的函数来调用生成器,该函数循环遍历生成器并执行yield所返回的每个asynch函数并返回返回函数的结果返回到生成器?

我仍然不清楚究竟如何执行yield所返回的asynch函数。如果它是由调用生成器的函数执行的,那么它是否异步执行?我猜是这样,因为否则会导致阻塞行为。

总结我的问题:

  1. 要使用生成器编写“线性”异步代码,是否有必要在生成器上进行迭代的调用函数,将产生的函数作为回调执行,并将回调结果返回到生成器中?
  2. 如果对问题1的回答是“是”,那么产生的函数究竟是如何异步执行的?

任何人都可以对整个过程如何进行更好的概述/总结吗?


问题答案:

使用生成器编写异步代码时,您要处理两种类型的函数:

  • __用声明的 普通 函数function。这些功能 无法 屈服。您无法以同步方式编写异步代码,因为它们可以完成。您只能通过回调处理异步完成(除非您调用node-fibers库或代码转换之类的额外功能)。
  • __用声明的 生成器 函数function*。这些功能 可以 产生。您可以在它们内部以同步样式编写异步代码,因为它们可以让步。但是您需要一个伴随函数来创建生成器,处理回调并在每次触发回调时通过调用恢复 生成器next

有几个实现 伴随功能的
库。在大多数这些库中,伴随函数function*一次只能处理一个,因此您必须function*在代码中的每一个周围都包装一个包装。星系库(我写的)有点特殊,因为它可以处理没有中间包装的function*其他调用function*。伴随函数有点棘手,因为它必须处理一堆生成器。

执行流程可能很难理解,因为yield/nextfunction*和伴侣函数之间的舞蹈很少。理解流程的一种方法是用您选择的库编写一个示例,console.log在代码和库中添加语句,然后运行它。



 类似资料:
  • 本文向大家介绍Node.js中的异步生成器与异步迭代详解,包括了Node.js中的异步生成器与异步迭代详解的使用技巧和注意事项,需要的朋友参考一下 前言 生成器函数在 JavaScript 中的出现早于引入 async/await,这意味着在创建异步生成器(始终返回 Promise 且可以 await 的生成器)的同时,还引入了许多需要注意的事项。 今天,我们将研究异步生成器及其近亲——异步迭代。

  • 问题内容: 我已经使用了很长一段时间了(使用python绑定以及大多数情况下),每次我需要执行javascript代码时,我都使用过method。例如,用于滚动页面(python): 或者,要在另一个元素(量角器)内无限滚动: 或者,为了获取所有元素属性的字典)(python): 但是,WebDriver API也具有我个人未使用过的功能。 它涵盖了哪些用例?什么时候应该代替常规? 这个问题是se

  • 问题内容: 我目前正在阅读Python,目前正在研究生成器。我发现很难回头。 从Java的背景出发,是否有Java的等效语言?这本书讲的是“生产者/消费者”,但是当我听说线程的时候。 什么是发电机,为什么要使用它?显然,无需引用任何书籍(除非您可以直接从书籍中找到一个体面,简单的答案)。也许举一些例子,如果您感到慷慨! 问题答案: 注意:本文采用Python 3.x语法。† 一个发电机仅仅是它返回

  • 但是,了解node.js事件循环会发现: 当然,在后端,有用于DB访问和进程执行的线程和进程。 在C#中,编写带有标记的函数和带有的调用就足够了,这样.NET就可以将它放在另一个线程中。但是,node.js中组织方式不同的东西让我很困惑,async/await函数仍然会阻塞主线程。

  • 异步注解@Async,默认情况下是不生效的,需要的话可以启用. 该加载器有一个可选参数,线程池大小,默认是32,详情可以查阅org.nutz.aop.interceptor.async.AsyncAopIocLoader @IocBy( args={"*json","ioc/", "*anno","net.wendal.nutzbook", "*a

  • Node 库以多种方式处理异步功能。最常见的模式是 error-first callbacks,但是你还可能会遇到 streams、promises、event emitters、child processes, 或 observables。gulp 任务(task)规范化了所有这些类型的异步功能。 任务(task)完成通知 当从任务(task)中返回 stream、promise、event e