带睡眠和不带睡眠的递归异步

2023-11-23

我有两个版本的异步函数

async function asyncRecurseOne(i){
    try{
        console.log(i)
        i = i +1;
        await asyncRecurseOne(i)
    }catch(ex){
        console.log(ex);
    }
}

asyncRecurseOne(0);

这会导致最大调用堆栈大小超过 6300 左右

6246
6247
6248
RangeError: Maximum call stack size exceeded
    at asyncRecurseOne (/home/amit/Projects/NodeJs/MJS/recurse.js:38:17)
    at asyncRecurseOne (/home/amit/Projects/NodeJs/MJS/recurse.js:36:15)

现在在另一个版本中,我使用 sleep 方法执行以下操作

let sleep = (time) => new Promise((resolve) => setTimeout(resolve, time))
async function asyncRecurseTwo(i){
    try{
        console.log(i)
        i = i +1;
        await sleep(100);
        await asyncRecurseTwo(i)
    }catch(ex){
        console.log(ex);
    }
}

而且这个函数没有给出解决问题的最大调用堆栈大小,我在我的系统上运行直到记录了数字 20000。

第二个函数如何在不达到最大堆栈大小问题的情况下继续执行?


async函数同步执行,直到它们到达某个点await,此时他们返回一个承诺。您的第一段代码在此行上只有一个等待:

await asyncRecurseOne(i)

要评估这条线,需要调用asyncRecurseOne,得到返回值,然后才可以await。因此它将同步递归,并且下一次通过该函数将执行相同的操作,构建越来越大的调用堆栈,直到出现异常。它永远不会到达await.

你的另一个案例没有这个问题。它到达了这一行:

await sleep(100);

睡眠创造并回报承诺。然后它击中了await,所以你的函数返回它自己的承诺。没有增加调用堆栈。 100 毫秒后,它恢复并递归,但这个新的递归具有相同的中断,因此调用堆栈不会继续增长。

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

带睡眠和不带睡眠的递归异步 的相关文章

  • javascript中如何无限循环

    我尝试使用 0 到 100 和 100 到 0 之间的 while 进行无限循环 但浏览器崩溃了 有没有办法清除浏览器内存 这是我的代码 var a 0 var flag true while true if a lt 100 flag t
  • javascript 正则表达式用于空格或

    我正在寻找一个用于空白的 javascript 正则表达式 我正在循环中检查几个不同的字符串 我需要找到其中有大空白的字符串 空白字符串构建在一个循环中 就像这样 请将此代码阅读为var whitespace nbsp 然后循环只是在其上连
  • javascript switch/case :比较类型吗? [复制]

    这个问题在这里已经有答案了 可能的重复 在 Javascript switch 语句中进行严格比较是否安全 https stackoverflow com questions 6989902 is it safe to assume str
  • Jest 中从未调用图像 onLoad 处理程序

    我正在尝试使用 Jest 测试将 dataUrl 加载到图像中 我正在使用 JSDOM 并按照说明添加resources usable 作为一个选项 如果我直接从 Node 运行该代码 则该代码可以工作 但是当我尝试在 Jest 中运行它时
  • Yeoman-Angular 生成的应用程序中缺少 Angular 脚本

    我已经使用 Yeoman Angular Generator 生成了一个应用程序 但项目中缺少 angular js 和其他 Angular 文件 我可以在 Bower json 文件中看到这些依赖项 如下所示 name mi portfo
  • angularjs 自定义过滤器检查数据数组内的值

    我有两个过滤器 它们根据数据中的队列键过滤数据 这是我的代码 var app angular module app app controller mainController function scope Data object scope
  • 使用shinyjs通过javascript在闪亮的应用程序中操作现有的Leaflet地图

    我有一个闪亮的应用程序 其中包含现有的传单地图 我希望能够在渲染后使用自定义 javascript 通过shinyjs包裹 一个最小的例子如下 app R packages library dplyr library leaflet lib
  • 使用 word_number 值对 javascript 数组进行排序

    如何对数组进行排序 var arr new Array word 12 word 59 word 17 这样我得到 word 12 word 17 word 59 Thanks 您需要编写一个排序方法 您可以编写任何您喜欢的方法 该方法在
  • 向下滚动时如何使图像移动?

    这是我想要实现的目标的示例 https www flambette com en https www flambette com en 我尝试过更改图像的 css 属性 但效果不能满足我的需求 我尝试过以下代码 mydocument on
  • IE8 中的 Javascript 消息超出堆栈空间

    我正在使用 Breeze 1 4 1 Internet Explorer 8 和 ASP NET MVC 4 Web API 我在查询时收到以下消息 查询失败 localhost port breeze Data Metadata 元数据导
  • Ember.js 数组作为模型的属性

    干杯 我有一些模型 它的一个属性是一个数组 但由于某些原因 我在服务器上使用 mongoDB 并且它是嵌入式模型和 ember data 的问题 我不能做这样的事情 App Foo DS Model extend numbers DS ha
  • 在 Javascript 中,使用 var foo = function foo(i) { ... } 的动机或优点是什么?

    我在答案中看到 在Javascript中 为什么要写 var QueryStringToHash function QueryStringToHash query https stackoverflow com questions 3233
  • jQuery UI 对话框使用 setTimeout 自动关闭

    我试图让对话框在打开后三秒自动关闭 我尝试过以下方法 setTimeout mydialog dialog close 3000 这是在上下文中 acknowledged dialog dialog height 140 modal tru
  • Javascript 根据字段值任意排序数组

    所以我有一个对象数组 如下所示 var myArray priority low priority critical priority high 我需要以这种方式排序 1 关键 2 高和3 低 如何才能做到这一点 我建议使用一个对象来存储排
  • 表单提交不起作用

    我有一张桌子 可以打印出所有可用的相机 它使用表单来更改这些设置 问题在于该表单仅更新条目中的最后一个摄像机 换句话说 如果我更改表单并为列表中的最后一个摄像机点击 应用 它将起作用 如果我更改此列表中任何其他摄像机的表单 它会将其更改为与
  • Django 模板变量从 {% for %} 循环到 Javascript

    这是一个迭代记录的 Django 模板 每条记录都包含一个由 JS 函数填充的 div 为了让 JS 知道要做什么 它需要从每次 for 循环迭代中获取一个变量并使用它 我不知道具体如何实现这一目标或是否可能 我不知道 也许记录在单独的 J
  • 传单 - 导入 Geojson - Angular 6

    我尝试将 GeoJson 文件导入到 Angular 的应用程序 6 中的传单中 通过这个解决方案 我的 geojson 是在 leafletmap 中绘制的 但我有这个错误 我无法构建我的应用程序 有人知道一种解决方案吗 错误 TS234
  • 使用重复模式捕获正则表达式

    我试图捕获字符串的所有部分 但我似乎无法正确处理 该字符串具有以下结构 1 22 33 中间有运算符的数字 可以有任意数量的术语 我想要的是 1 22 33 1 22 33 但我得到 1 22 33 22 33 我尝试过各种正则表达式 这是
  • 如何制作饼图聚合数据源?

    Using 适用于 ASP NET MVC 的 Kendo UI 完整版 http www kendoui com 版本 2013 3 1119 2013年11月20日 如果我有这段代码 status chart kendoChart da
  • 通过jquery ajax()和serialize()提交html表单

    我想通过 jquery ajax 提交此表单 这是我所做的 但它不起作用 即表单正在提交并刷新页面 但我没有看到响应 即在同一页面上打印数组 HTML

随机推荐

  • python-opencv AttributeError:“模块”对象没有属性“createBackgroundSubtractorGMG”

    我正在尝试遵循以下中给出的教程 https opencv python tutroals readthedocs org en latest py tutorials py video py bg subtraction py bg sub
  • 在 Mac OS 上设置 tkinter 图标

    我正在尝试更改 Mac OS 的 tk 应用程序上显示的图标 上次我检查此代码适用于 Windows 目标是使该解决方案能够跨所有平台工作 root tk Tk app Application master root app master
  • Clion 无法识别我的快速工具链路径

    我正在尝试为 swift 项目配置 clion 但它无法识别 swift 工具链路径 which swift 产生输出 usr bin swift bin swift 所以工具链就在那里 但 clion 只是不认识它 我该如何进行这项工作
  • jQuery 工具提示 onClick?

    我已经找了很长时间了 似乎找不到一个使用以下内容的 jQuery 工具提示插件 onClick 代替hover 使其像切换按钮一样工作 淡入淡出 使用工具提示的想法是 我有一些想要在其中显示内容的链接 虽然普通的工具提示 这可能是我出错的地
  • 如何在 Windows 上安装 pip?

    pip是替代品easy install 但我应该安装pip using easy install在 Windows 上 有没有更好的办法 Python 3 4 和 2 7 9 好消息 Python 3 4 2014 年 3 月发布 和Pyt
  • MySQL 表的主键是否应该公开?

    我有许多描述模型的 MySQL 表 例如 用户 业务 等 这些表的主键是否应该暴露给客户端 我主要是从安全角度来问 但是还有其他我没有想到的考虑因素吗 暴露您的主键 特别是如果它们是可预测的 是一个称为不安全直接对象引用的漏洞 通过使用如下
  • 如何设置 NSDate 上的时间?

    我想用我想要的小时 分钟 秒设置 NSDate 时间 目前我正在使用 NSDate 组件 但它没有给出期望的结果 comps setHour hours comps setMinute 0 comps setSecond 0 NSDate
  • 有人有 SourceForge 的 Xselerator XSL IDE 副本吗? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我多年来一直使用 Marrowsoft Xselera
  • 使用 python pandas 比较两个 csv 文件

    我有两个 csv 文件 均由两列组成 第一个具有产品 ID 第二个具有序列号 我需要查找第一个 csv 中的所有序列号 并在第二个 csv 上查找匹配项 结果报告将在单独的列中包含匹配的序列号以及每个 csv 中相应的产品 ID 我确实修改
  • ASP.NET MVC 4 C# HttpPostedFileBase,如何存储文件

    Model public partial class Assignment public Assignment this CourseAvailables new HashSet
  • 我可以使用 Boost.Asio 在多线程 I/O 服务上同步读取套接字并设置超时吗?

    我有一个使用 Boost Asio 进行 TCP 和 UDP 套接字通信的应用程序 我知道 Asio 中的 A 代表异步 因此该库致力于鼓励您尽可能使用异步 I O 我有一些情况 同步套接字读取更可取 但与此同时 我想为所述接收调用设置超时
  • created_at 字段有时会变成 nil

    I think created at总是设置为ActiveRecord创建记录的时间 但我发现有些记录是用null创建的created at 有什么条件可以导致这种情况吗 这些列created at updated at created o
  • 使用 google-rfc-2445 (iCalendar) 时,某些情况下会返回开始日期

    我运行了很多 RRULE 只是为了测试性能谷歌 rfc 2445 Java 实现IETF RFC 2445 日历 我发现在某些情况下我在方法的返回列表中得到了开始日期 测试非常简单 private static void runGoogle
  • ReactJS中如何处理多选表单

    我尝试处理一个多种表单选择选项 在 ReactJS 中 我试图激发 javascript 经典代码的灵感来处理这个问题 但我失败了 我的代码只是不向我发送所选的值 怎么处理呢 这是我的代码 class ChooseYourCharacter
  • 如何在 ExtJS 4 中实现流程布局?

    我想使用一种布局 其中组件像 hbox 一样水平添加 但在添加时 如果组件超出容器的边界 则会移动到下一行 这与swing和flex中的FlowLayout类似 我在 ExtJS 4 0 中找不到任何可以实现此目的的布局 所以我想知道我将如
  • 如何使两个函数参数隐式

    假设我们有一个以函数作为参数的对象apply method object Wrapper def apply block TypeA gt String TypeA a block a TypeA是应用程序的域类型 现在 当我定义内联块时
  • JavaFX ScrollPane 以编程方式移动视口 - 使内容居中

    我可以使用 setVvalue double 和 setHvalue double 方法在 JavaFX ScrollPane 中移动视口 我正在努力做的是根据其位置将特定节点置于滚动窗格内容的中心 我尝试过 localToScene 和b
  • 如果未定义索引操作返回视图还是副本,那么 pandas 中的视图有何意义?

    我已经从 R 切换到 pandas 当我做类似的事情时 我经常得到SettingWithCopyWarnings df a pd DataFrame col1 1 2 3 4 Filtering step which may or may
  • 防止 ImageMagick 转换为灰度

    我在 Windows 上使用 ImageMagick 6 9 1 调整 PNG 文件的大小 然后再使用其他工具处理它 源文件是 RGBA 但图像数据是灰度 所有像素的 R G 和 B 值相同 看来 ImageMagick 正在检测到这一点
  • 带睡眠和不带睡眠的递归异步

    我有两个版本的异步函数 async function asyncRecurseOne i try console log i i i 1 await asyncRecurseOne i catch ex console log ex asy