我应该如何循环遍历依赖于前一个循环值的异步函数?

2023-12-08

我试图在 node.js 中执行的操作的同步版本(为了可读性而简化):

var value = null;
var allValues = [];
do{
  value = getValue(value); //load the next value
  if(value) allValues.push(value);
}while(value);
console.log("Got all values:",allValues);

目标是迭代所有值,但是除非我传入当前值,否则 getValue 函数将仅返回第一个值(导致无限循环)。

在node.js中,getValue()函数是异步的,我希望它是异步的,但是如果我这样做:

var allValues = [];
function iterateGetValue(value){
    if(value){
        allValues.push(value);
        getValue(value,iterateGetValue);
    }else console.log("Got all values:",allValues);
}
getValue(null,iterateGetValue);

我担心 N 次迭代(getValue 在结束之前可能会触发数千次)我会遇到堆栈限制问题(我错了吗?)。我研究了 Promises 和其他异步技巧,但在我看来,所有这些技巧都在继续推动堆栈(我错了吗?)。

我的堆栈限制假设是否不正确,或者是否有一些我缺少的明显方法可以做到这一点?

另外,我不能忙着等待将异步 getValue 转换为同步 getValue,这违背了使用异步的全部目的。


我将达到堆栈限制

不,你不会。如果它们确实是异步的,那么下一次调用iteratGetValue将位于一个新的堆栈帧中 - 源自异步回调处理程序的顶级执行上下文。 Promise 也是如此 -其中一些是偶数required是异步的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我应该如何循环遍历依赖于前一个循环值的异步函数? 的相关文章

随机推荐

  • Latex中@符号是什么意思

    例如 def if nch mpty 1 def temp a 1 ifx temp a empty def f nch def 1 2 if nch mpty 2 f nch gbl def 1 leavevmode else f nch
  • 将寄存器值读入 C 变量 [重复]

    这个问题在这里已经有答案了 我记得看到过一种使用扩展 gcc 内联汇编来读取寄存器值并将其存储到 C 变量中的方法 但我一辈子都不记得如何形成 asm 语句 编者注 这种使用本地寄存器asm变量的方法是现在被 GCC 记录为 不支持 它通常
  • Microsoft Graph API:尝试检索租户策略时出现 403 Forbidden 错误

    我正在尝试使用 Microsoft Graph API 检索在 Azure AD 门户上为我的租户创建的策略 据我从图形 API 文档中了解到 所有策略 CRUD 操作都需要一个范围目录 AccessAsUser All 此范围转换为权限以
  • log4j 选择错误的属性文件

    我的类路径中有 2 个 log4j properties 文件 我需要它们 其中一个是我正在使用的库所必需的 另一个是我的代码使用的库 当我运行我的 jar 文件时 它能够读取库使用的属性 但它不会读取我自己的属性文件 如何让它读取我的 l
  • 找不到与给定名称匹配的资源(在“paddingBottom”处,值为“@dimen/activity_vertical_margin”)

    我试图构建一个导航抽屉 我从某个网站复制了代码 但在其中一个 XML 中收到此错误 找不到与给定名称匹配的资源 在 paddingBottom 处 值为 dimen 活动垂直边距 如何摆脱这个错误
  • 带有 .js 扩展名的 Webpack/ts-loader 导入无法解析

    我的目录结构如下 projectRoot project server src pom xml project ui tsconfig json src file ts imports file js 我的问题是project server
  • 错误:ORA-00907:缺少右括号 - 您能帮助解决问题吗

    select regexp substr replace replace replace CA CO IL KS chr 40 chr 41 chr 39 1 level as division from dual connect by l
  • 使用 Node.js 自动将文本写入控制台

    我需要使用 SSH 和 Node js 脚本克隆 GitHub 存储库 var exec require child process exec exec git clone email protected jquery jquery git
  • 如何仅对具有特定属性集的元素使用 querySelectorAll?

    我正在尝试使用document querySelectorAll对于所有具有value属性集 页面上还有其他复选框没有value设置 并且每个复选框的值都不同 但 ID 和名称并不唯一 例子
  • HtmlUnit 按钮单击

    我正在尝试在 www meetme com 上发送消息 但不知道该怎么做 我可以在评论区域中输入消息 但单击 发送 按钮不会执行任何操作 我究竟做错了什么 当我登录并按登录按钮时 页面确实发生了变化 一切都很好 有人有任何想法或线索吗 Ht
  • 什么是对象/关系不匹配

    我是java新手 正在阅读有关对象关系映射的内容 我在此链接上发现了术语 对象 关系不匹配 休眠 谁能用 Java 解释一下什么是对象 关系不匹配 我也读到过黑客攻击网站但无法正确获得它 用示例进行解释将是值得赞赏的 Hibernate 是
  • Heroku 应用程序坚持使用 HTTPS - 为什么?

    我有一个有趣的小问题 Heroku 上的一个应用程序被配置为使用Heroku SSL 测试版 但无论我做什么 它似乎都想使用 HTTPS 浏览器错误 I have redirect to protocol gt http status gt
  • 如何使用 oozie 安排 sqoop 操作

    我是 Oozie 的新手 只是想知道 如何使用 Oozie 安排 sqoop 作业 我知道 sqoop 操作可以添加为 Oozie 工作流程的一部分 但是我如何安排 sqoop 操作并让它每隔 2 分钟或每天晚上 8 点自动运行一次 只是一
  • JDBC-JTDS 错误?对于日期和时间 (x) 类型的列

    当我尝试从中获取列类型时ResultSetMetaData用方法getColumnTypeName对于类型date and time x 我越来越nvarchar 对于其他类型似乎效果很好 这是一个错误吗 和ResultSet getStr
  • 为什么Golang创建切片时会有CAPACITY参数

    这是一个非常简单的问题 If the capacityGolang中的一个切片的容量是可以被超出的 为什么首先要有一个容量参数呢 我认为这与内存管理 某种 知道在内存中分配切片的位置 但我不确切知道 If the capacityGolan
  • MSChart 轴线

    如何显示图表中每个条形的轴线 我只有第二个 第四个 替代文本 http img35 imageshack us img35 6106 chartiu png 我找到了答案 chartArea AxisX MajorGrid Interval
  • 控制 ggparcoord 中的颜色(来自 GGally 包)

    我正在尝试对特定 ggparcoord 图硬编码所需的线条颜色 例如 当我创建下面的 ggparcoord 图时 library GGally x data frame a runif 100 0 1 b runif 100 0 1 c r
  • Bash - 查找匹配的文件对[重复]

    这个问题在这里已经有答案了 我的文件夹中有很多文件 Filename1 mp4 Filename2 mp4 Filename3 mp4 Etc 以及许多名称添加后缀的文件 Filename1 x264 mp4 Filename2 x264
  • 脚本无法正确接收 url

    我正在使用组合的批处理和java脚本 我发现使用批处理文件从网站检索html 而我们解决的一个问题是没有返回所需的输出 就像我在firefox中使用url时出现的那样 我用来拉取 html 的脚本是 if This IsBatch then
  • 我应该如何循环遍历依赖于前一个循环值的异步函数?

    我试图在 node js 中执行的操作的同步版本 为了可读性而简化 var value null var allValues do value getValue value load the next value if value allV