首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么在递归异步函数中添加then会使其返回未定义的值?

在递归异步函数中添加then会使其返回未定义的值的原因是因为递归异步函数本身是一个异步操作,而then方法是用于处理异步操作的回调函数。当递归异步函数执行到then方法时,它会立即返回一个Promise对象,并将回调函数添加到异步操作的回调队列中等待执行。然而,由于递归异步函数是递归调用的,每次递归调用都会创建一个新的Promise对象,并返回给上一层的then方法。由于递归调用是异步的,所以在递归调用之前,上一层的then方法已经执行完毕并返回了一个Promise对象,而递归调用的then方法还未执行,因此返回的Promise对象的值是未定义的。

这种情况下,可以考虑使用async/await来处理递归异步函数。async/await是一种更直观、简洁的处理异步操作的方式。通过在递归函数前加上async关键字,可以将其转换为一个返回Promise对象的异步函数。然后,在递归调用的地方使用await关键字来等待异步操作的结果,确保递归调用的顺序和结果的正确性。

总结起来,递归异步函数中添加then会使其返回未定义的值是因为递归调用的then方法还未执行,导致返回的Promise对象的值是未定义的。可以使用async/await来替代then方法,更直观、简洁地处理递归异步函数。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

【Kotlin 协程】Flow 异步流 ① ( 以异步返回返回多个返回值 | 同步调用返回多个值的弊端 | 尝试在 sequence 中调用挂起函数返回多个返回值 | 协程中调用挂起函数返回集合 )

文章目录 一、以异步返回返回多个返回值 二、同步调用返回多个值的弊端 三、尝试在 sequence 中调用挂起函数返回多个返回值 四、协程中调用挂起函数返回集合 一、以异步返回返回多个返回值 ----...在 Kotlin 协程 Coroutine 中 , 使用 suspend 挂起函数 以异步的方式 返回单个返回值肯定可以实现 , 参考 【Kotlin 协程】协程的挂起和恢复 ① ( 协程的挂起和恢复概念...| 协程的 suspend 挂起函数 ) 博客 ; 如果要 以异步的方式 返回多个元素的返回值 , 可以使用如下方案 : 集合 序列 Suspend 挂起函数 Flow 异步流 二、同步调用返回多个值的弊端...sequence 中调用挂起函数返回多个返回值 ---- 尝试使用 挂起函数 kotlinx.coroutines.delay 进行休眠 , 这样在挂起时 , 不影响主线程的其它操作 , 此时会报如下错误...---- 如果要 以异步方式 返回多个返回值 , 可以在协程中调用挂起函数返回集合 , 但是该方案只能一次性返回多个返回值 , 不能持续不断的 先后 返回 多个 返回值 ; 代码示例 : package

8.3K30

2018-7-18pythoh中函数的参数,返回值,变量,和递归

*****************************************************************                                  函数中的参数的初级和返回值...: 技术文档中[]方括号里面的东西表示可选的 参数:函数运行需要的数据   如果没有参数会提示:missing 1 required positional, 函数的两个要点,参数和返回值: 1.如果函数有参数在调用执行函数的时候要把参数写里面...: variable  变量 函数中的变量分全局变量和局部变量,函数外的为全局变量,函数内的为局部变量 在函数中如果需要修改全局变量的值,需要先用global+name声明一下全局变量放在定义的函数顶部...,函数递归比循环消耗内存 在函数中尽量定义局部变量 开发一个项目一般把项目分成三个部分,分别是: data.py(存放数据的文件) tools.py(存放函数的文件) main.py(存放函数执行的文件...: 定义一个函数表示 一个行为 #在一个函数中可以调用另一个函数,叫做函数的相互调用 #在函数也可以调用自己叫做函数的递归 #第一种:两个行为是相互独立的 # def movie(): #

2.1K40
  • 全面解析C#中的异步编程为什么要异步过去糟糕的体验一个新的方式Tasks基于任务的异步编程模型Async和await时间处理程序和无返回值的异步方法结束语

    为什么要异步 一直以来,使用远程资源的编程都是一个容易造成困惑的问题,不同于“本地资源”,远程资源的访问总会有很多意外的情况,网络环境的不稳定机器服务端的故障,会造成很多程序员完全不可控的问题,所以这也就要求程序员需要更多的去保护远程资源的调用...在这个例子中,WebClient提供了一个异步版本的DownloadData方法—DownloadDataAsync,它会立即返回,然后在DownloadDataCompleted后触发一个事件,这允许用户写一个异步版本的方法分割所要做的事...代码用递归取代了循环,这种代码你应该都不敢直视了吧。不要着急,还没有完 。 原始的代码返回了一个总数并且显示它,新的一步版本在统计还没有完成之前返回给调用者。...异步的方法没有额外的方法,依照惯例为了区别同步版本的方法,我们在方法名后添加Async作为新的方法名。...时间处理程序和无返回值的异步方法 异步方法可以从其他异步方法使用await创建,但是异步在哪里结束?

    2.3K60

    数据结构与算法:递归算法

    为什么需要递归 递归是一项令人惊奇的技术,借助它我们可以减少代码的长度并使其更易于阅读和编写。与稍后将讨论的迭代技术相比,它具有某些优点。...递归函数如何存储在内存中? 递归使用更多内存,因为递归函数会在每次递归调用时将值添加到堆栈中,并将值保留在那里,直到调用完成。递归函数使用 LIFO(后进先出)结构,就像堆栈数据结构一样。...阶乘的基本情况是 n = 0。当 n = 0 时,我们返回 1。 为什么递归会出现Stack Overflow错误? 如果未达到或未定义基本情况,则可能会出现堆栈溢出问题。...递归函数调用自身,被调用函数的内存分配在分配给调用函数的内存之上,并且为每个函数调用创建不同的局部变量副本。当达到基本情况时,函数将其值返回给调用它的函数,并且内存被解除分配,并且该过程继续。...在输出中,打印从 3 到 1 的值,然后打印 1 到 3。内存堆栈如下图所示。

    19410

    1000多个项目中的十大JavaScript错误以及如何避免

    二是当通过异步的方式获取数据时,无论是在构造函数中 componentWillMount 中,还是在构造函数中提取 componentDidMount,组件在数据加载之前至少会渲染一次。...解决的方法很简单:在构造函数中使用合理的默认值进行状态初始化。...有趣的是,在 JavaScript 中,null 和 undefined 是两种不同的类型,这就是为什么会出现两个不同的错误消息。未定义通常是一个尚未分配的变量,而 null 则表示该值为空。...Uncaught RangeError: Maximum Call Stack 这是在很多种情况,Chrome 中发生的错误,一种情况是当你调用一个不会终止的递归函数时。 ?...如果将值传递给超出范围的函数,也可能会发生这种情况。许多函数只接受特定范围内的数字输入值。

    8.4K40

    10 种 JavaScript 最常见的错误

    当异步获取数据时,不管它是在构造函数 componentWillMount 还是 componentDidMount 中获取的,组件在数据加载之前至少会呈现一次,当 Quiz 第一次呈现时, this.state.items...最简单的方法:在构造函数中初始化 state。...有趣的是,在 JavaScript 中, null 和 undefined 是并不同,这就是为什么我们看到的是两个不同的错误信息。...在我们工作中,这种错误可能发生的一种场景是:如果在加载元素之前尝试在 JavaScript 中使用元素。 因为 DOM API 对于空白的对象引用返回值为 null。...此外,如果您将值传递给超出范围的函数,也可能会发生这种情况。 许多函数只接受其输入值的特定范围的数字。

    8.6K20

    50道JavaScript详解面试题,你需要了解一下

    答案,是B,因为异步函数在JavaScript中返回Promises 。 8、等待关键字会阻止应用程序中的所有JavaScript代码执行,直到返回等待的Promises?...10、以下是用于打印“用户名”的有效语法? 以下语法是有效的,因为我们正在将异步函数的返回值传递给callback。 11、typeof和instanceof之间没有什么区别?...该对象位于原型链的顶部,当浏览器查找访问属性的值时,它将遍历原型链,直到找到该值或直到不再遍历所有原型为止。 15、空值合并运算符做什么? 当左侧操作数为null或未定义时,它将返回右侧操作数。...控制台输出将为10和5,因为该函数在Promise中没有异步的内容,并且Promise同步解析。 32、在浏览器下一次重画显示内容之前,哪个函数会执行指定的代码块?...是的,例如,在if语句中,需要在评估中返回一个布尔值,例如if(a!== b)。 50、JavaScript中的哪个ES6函数返回一个新数组? map()和filter()。

    3.5K40

    并发问题解密:探索多线程和锁机制

    thread在返回之前,成功调用pthread_create()将新线程的ID存储在thread指向的缓冲区中;此标识符用于在后续调用其他pthreads函数时引用线程。...start_routine线程入口函数arg线程入口函数的参数返回值:成功时,返回0;出错时,它返回一个错误号,并且*thread的内容未定义。...任何其他使用已销毁线程属性对象的方法都会产生未定义的结果。返回值:成功时,这些函数返回0;出错时,它们返回一个非零错误号。...互斥锁的属性在创建锁的时候指定,在实现中仅有一个锁类型属性,不同的锁类型在试图对一个已经被锁定的互斥锁加锁时表现不同。返回:成功会返回零,其他任何返回值都表示出现了错误。...如果线程尝试解锁尚未锁定的互斥体或已解锁的互斥体,则将返回错误。PTHREAD_MUTEX_DEFAULT尝试递归锁定互斥会导致未定义的行为。

    22410

    1000多个项目中的十大JavaScript错误以及如何避免

    二是当通过异步的方式获取数据时,无论是在构造函数中 componentWillMount 中,还是在构造函数中提取 componentDidMount,组件在数据加载之前至少会渲染一次。...解决的方法很简单:在构造函数中使用合理的默认值进行状态初始化。...[image.png] 有趣的是,在 JavaScript 中,null 和 undefined 是两种不同的类型,这就是为什么会出现两个不同的错误消息。...}; Uncaught RangeError: Maximum Call Stack 这是在很多种情况,Chrome 中发生的错误,一种情况是当你调用一个不会终止的递归函数时。...IE 这样的浏览器提供了全局变量事件,Chrome 会自动将事件变量附加到处理程序中,Firefox 则不会自动添加事件变量。

    6.2K30

    1000个项目中前10名的JavaScript错误介绍

    当异步获取数据时,不管它是在构造函数componentWillMount还是componentDidMount中获取的,组件在数据加载之前至少会呈现一次,当 Quiz 第一次呈现时,this.state.items...最简单的方法:在构造函数中用合理的默认值来初始化 state。...有趣的是,在 JavaScript 中,null 和 undefined 是不一样的,这就是为什么我们看到两个不同的错误信息。...因为 DOM API 对于空白的对象引用返回值为 null。 任何执行和处理 DOM 元素的 JS 代码都应该在创建 DOM 元素之后执行。 JS 代码按照 HTML 中的规定从上到下进行解释。...您可以在 Chrome 开发者控制台中进行测试。 ? 此外,如果您将值传递给超出范围的函数,也可能会发生这种情况。 许多函数只接受其输入值的特定范围的数字。

    6.2K10

    10 种最常见的 Javascript 错误

    当异步获取数据时,不管它是在构造函数componentWillMount还是componentDidMount中获取的,组件在数据加载之前至少会呈现一次,当 Quiz 第一次呈现时,this.state.items...最简单的方法:在构造函数中用合理的默认值来初始化 state。...有趣的是,在 JavaScript 中,null 和 undefined 是不一样的,这就是为什么我们看到两个不同的错误信息。...在现实世界的例子中,这种错误可能发生的一种场景是:如果在加载元素之前尝试在 JavaScript 中使用元素。 因为 DOM API 对于空白的对象引用返回值为 null。...您可以在 Chrome 开发者控制台中进行测试。 ? 此外,如果您将值传递给超出范围的函数,也可能会发生这种情况。 许多函数只接受其输入值的特定范围的数字。

    6.8K80

    同步&异步日志系统:前置知识

    IO,影响程序性能 1.5.2 异步写日志      异步⽇志是指在进⾏⽇志输出时,日志输出语句与业务逻辑语句并不是在同⼀个线程中运行,而是有专门的线程用于进行日志输出操作。...其中printf函数就是⼀个不定参函数,在函数内部可以根据格式化字符串中格式化字符分别获取不同的参数进⾏数据的格式化。⽽这种不定参函数在实际的使⽤中也⾮常多⻅!!!...ap, int):将当前ap指向的值返回,并使ap指针按照type类型向后移动,va_arg中第二个参数类型名要与返回值类型相同(决定了向后移动几个字节) va_end(ap):完成清理工作,释放动态分配申请的用于存储参数的内存...如果乱写的话可能导致未定义的行为,因为va_arg会尝试读取超出传入参数数量的内存。  如果我们的va_argc传的类型不匹配呢??那这必然导致我们读到的数据是错的!!!      ...成功的话会返回对应的字节数,失败的话会返回-1  #define _GNU_SOURCE #include #include #include

    10300

    37个JavaScript基本面试问题和解答(建议收藏)

    但在内部函数中,这不再指向myObject。因此,this.foo在内部函数中是未定义的,而对局部变量self的引用仍然在范围内并且可以在那里访问。...他们都会返回同样的值吗?为什么或者为什么不?...如果传递的参数数量超过了函数定义中参数的数量,则超出的参数将被忽略。另一方面,如果传递的参数数量少于函数定义中的参数数量,则在函数内引用时,缺少的参数将具有未定义的值。...将该对象传递给Object.keys将返回一个包含这些设置键的数组(即使它们的值未定义)。 14、下面的代码将输出到控制台,为什么?...这很好,因为它在逻辑表达式中被视为“真”,但也可以用于在您关心时返回该值。这解释了为什么,有点令人惊讶的是,1 && 2返回2(而你可能会期望它返回true或1)。

    3K10

    JavaScript 编程精解 中文第三版 十一、异步编程

    在同步模型中,网络所花费的时间是给定控制线程的时间线的一部分。 在异步模型中,从概念上讲,启动网络操作会导致时间轴中出现分裂。...它注册了一个回调函数,当Promise解析并产生一个值时被调用。 你可以将多个回调添加到单个Promise中,即使在Promise解析(完成)后添加它们,它们也会被调用。...在同步编程模型中,表达会更简单。 好消息是 JavaScript 允许你编写伪同步代码。 异步函数是一种隐式返回Promise的函数,它可以在其主体中,以看起来同步的方式等待其他Promise。...每次在迭代器上调用next时,函数都会运行,直到它碰到yield表达式,该表达式会暂停它,并使得产生的值成为由迭代器产生的下一个值。 当函数返回时(示例中的那个永远不会),迭代器就结束了。...如果我从一个函数中调用setTimeout,那么在调用回调函数时该函数已经返回。 当回调返回时,控制权不会回到调度它的函数。 异步行为发生在它自己的空函数调用堆栈上。

    2.7K20

    【Python篇】Python 函数综合指南——从基础到高阶

    当程序越来越大时,函数使其更加有序和易于管理。 1.2 定义函数 在 Python 中,可以使用 def 关键字来定义函数。...min(): 返回所有输入值中的最小值。 max(): 返回所有输入值中的最大值。...高阶函数 高阶函数是指能够接收其他函数作为参数,或者将函数作为返回值的函数。在 Python 中,常见的高阶函数包括 map()、filter() 和 reduce()。...函数进阶知识 10.1 函数注解 Python 支持在函数定义时添加注解,以说明参数和返回值的预期类型。注解本身并不会影响函数行为,但可以用于文档生成或类型检查工具。...高阶函数 高阶函数是指接收其他函数作为参数,或者将函数作为返回值的函数。在 Python 中,常见的高阶函数包括 map()、filter() 和 reduce()。

    40810

    python_functions_part1_cn

    当程序越来越大时,函数使其更加有序和易于管理。 1.2 定义函数 在 Python 中,可以使用 def 关键字来定义函数。...min(): 返回所有输入值中的最小值。 max(): 返回所有输入值中的最大值。...高阶函数 高阶函数是指能够接收其他函数作为参数,或者将函数作为返回值的函数。在 Python 中,常见的高阶函数包括 map()、filter() 和 reduce()。...函数进阶知识 10.1 函数注解 Python 支持在函数定义时添加注解,以说明参数和返回值的预期类型。注解本身并不会影响函数行为,但可以用于文档生成或类型检查工具。...高阶函数 高阶函数是指接收其他函数作为参数,或者将函数作为返回值的函数。在 Python 中,常见的高阶函数包括 map()、filter() 和 reduce()。

    8310

    14万字 | 400多道JavaScript 面试题及详细答案(建议收藏)

    357 如果我们添加两个数组会发生什么? 358 在假值上添加加法运算符的输出是什么? 359 如何使用特殊字符创建自字符串? 360 如何从数组中删除虚假值? 361 你如何获得数组的唯一值?...以下是未声明和未定义变量之间的主要区别, undeclared undefined 这些变量不存在于程序中且未声明 这些在程序中声明但没有赋值的变量 如果您尝试读取未声明变量的值,则会遇到运行时错误 如果您尝试读取未定义变量的值...即, setInterval() 函数返回的返回值存储在一个变量中,并将其传递给 clearInterval() 函数以清除间隔。...在浏览器中,您可能会获得与 NodeJS 不同的元数据。...在 E5 中,我们需要依赖逻辑 OR 运算符来处理函数参数的默认值。而在 ES6 中,默认函数参数功能允许在未传递值或未定义时使用默认值初始化参数。

    12.7K20
    领券