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

有一个带有promise的函数。在这个函数中,我再次调用这个函数(递归)。如何等待递归承诺被解决?

在带有promise的函数中进行递归调用时,可以使用async/await或者.then()方法来等待递归承诺被解决。

使用async/await的方式:

  1. 在函数定义前加上async关键字,使其成为一个异步函数。
  2. 在递归调用的地方使用await关键字来等待承诺的解决。

示例代码如下:

代码语言:txt
复制
async function recursiveFunction() {
  // 执行一些操作

  // 等待递归承诺被解决
  await recursiveFunction();
}

// 调用递归函数
recursiveFunction();

使用.then()方法的方式:

  1. 在递归调用的地方使用.then()方法来处理承诺的解决。

示例代码如下:

代码语言:txt
复制
function recursiveFunction() {
  // 执行一些操作

  // 等待递归承诺被解决
  return recursiveFunction().then(() => {
    // 承诺解决后的操作
  });
}

// 调用递归函数
recursiveFunction();

以上是等待递归承诺被解决的两种常见方式,根据具体情况选择适合的方式来处理。

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

相关·内容

手写系列-这一次,彻底搞懂 Promise

当我麦当劳点一份汉堡套餐,收银员会给我一张收据,这个收据就是 Promise,代表已经付过钱了,麦当劳会为一个汉堡套餐承诺要通过收据来取这个汉堡套餐。...那么这个买汉堡得到承诺会有以下 3 种状态: 等待状态:刚下单,汉堡还没做好,这时可以等待汉堡时,同时做其他事情; 成功状态:汉堡做好了,通知取餐; 失败状态:发现卖完了,通知退款; 需要注意是...需要接收 1 个执行器函数作为参数,这个函数带有 2 个参数。...; promise 完成之前不能调用它; 它不能多次调用; onRejected 要求如下: 必须在 promise 拒绝后调用它,以 promise.reason 作为它一个参数; promise...解决方法:可以使用 setTimeout、setImmediate、MutationObserever、process.nextTick then 方法调用后将创建一个栈,这个我们后续处理,先正常往下看

20630

手写系列-这一次,彻底搞懂 Promise

当我麦当劳点一份汉堡套餐,收银员会给我一张收据,这个收据就是 Promise,代表已经付过钱了,麦当劳会为一个汉堡套餐承诺要通过收据来取这个汉堡套餐。...那么这个买汉堡得到承诺会有以下 3 种状态: 等待状态:刚下单,汉堡还没做好,这时可以等待汉堡时,同时做其他事情; 成功状态:汉堡做好了,通知取餐; 失败状态:发现卖完了,通知退款; 需要注意是...需要接收 1 个执行器函数作为参数,这个函数带有 2 个参数。...; promise 完成之前不能调用它; 它不能多次调用; onRejected 要求如下: 必须在 promise 拒绝后调用它,以 promise.reason 作为它一个参数; promise...解决方法:可以使用 setTimeout、setImmediate、MutationObserever、process.nextTick then 方法调用后将创建一个栈,这个我们后续处理,先正常往下看

37630
  • Node.js中常见异步等待设计模式

    已经用co编写了这些设计模式,但异步/等待使得这些模式可以vanilla Node.js访问,不需要外部库。...没有异步/等待,next()手动调用涉及与重试示例相同递归类型。...(promises)); } 该Promise.all()函数接受一组承诺,并返回一个承诺等待数组每个承诺解析,然后解析为一个数组,该数组包含解析原始数组每个承诺值。...Promise.all()并不是您可以并行处理多个异步函数唯一方式,还有一个Promise.race()函数可以并行执行多个promise等待一个解决承诺并返回承诺解决值。...ms)); console.log('waited', ms); return ms; } 请注意,尽管Promise.race()一个承诺解决解决,但其余async功能仍然继续执行。

    4.7K20

    你真的懂异步编程吗?

    ,当异步执行结束后,调用这个函数,将结果以实参形式传入函数调用(也有可能不传参,但是函数调用一定会有),前面代码 setTimeout 就是一个异步方法,传入一个参数就是 回调函数这个函数执行就是消息队列...,一定(承诺、许诺)给你个结果;执行过程Promise 状态会修改为 pending ,一旦了结果,就会再次更改状态,异步执行成功状态是 Fulfilled , 这就是承诺给你结果,状态修改后...于是, Promise 基础上,Async 函数来了; 终极异步解决方案,千呼万唤 ES2017发布了; Async/Await 语法糖 Async 函数使用起来,也是很简单,将调用异步逻辑全部写进一个函数...,函数前面使用 async 关键字,函数异步调用逻辑前面使用 await ,异步调用会在 await 地方等待结果,然后进入下一行代码执行,这就保证了,代码后续逻辑,可以等待异步 ajax...,可以 yield 接受返回值 generator.next('test123'); Generator 最大特点就是让函数运行,可以暂停,不要小看他,这个暂停,我们能做事情就太多,调用异步代码时

    83130

    一杯喜茶时间手搓Promise

    这就要想到「Promise对象」了,文本先来认识Promise,再手写代码实现Promise。 认识PromisePromise」是JS解决异步编程方法之一,其英文意思是「承诺」。...程序可理解为等一段时间就会执行,等一段时间就是JS异步。「异步」是指需要比较长时间才能执行完成任务,例如网络请求,读取文件等。Promise一个实例对象,可从中获取异步处理结果。...为了了解Promise如何实现,我们手写实现一个简单Promise方法,简单地实现「then()」、「异步处理」、「链式调用」。...链式调用是指Promise状态是fulfilled后,又开始执行下一个Promise。要实现这个功能,我们只需要在then()里返回Promise就好了,说起来好像是挺简单。...是否拥有then(),并且如果then()是一个函数,那么就可执行xthen(),并且带有成功与失败回调 flag作用是执行xthen()时成功与失败只能调用一次 执行xthen(),成功时继续递归解析

    76740

    前端异步代码解决方案实践(二)

    言简意赅,但稍微聱牙诘屈,如何表述更浅显易懂呢? 说个故事, Promise一个美好承诺承诺本身会做出正确延时或异步操作。...承诺解决 callback处理异步回调可能产生调用过早,调用过晚、调用次数过多过少、吞掉可能出现错误或异常问题等。另外承诺只接受首次 resolve(..)或 reject(..)...决议,承诺本身状态转变后不会再变,承诺所有通过 then(..)注册回调总是依次异步调用承诺所有异常总会被捕获抛出。她,是一个可信任承诺。...回调需要异步延迟调用。至于为什么要延迟调用,后文会慢慢解读。这里个重要知识点,回调函数异步调用时机。...callback 处理递归Promise 对象自动执行器,则是 then 方法内调用递归处理方法。

    3.3K60

    【愚公系列】2023年03月 其他-Web前端基础面试题(JS_高级_47道)

    闭包就是一个函数引用另外一个函数变量,因为变量引用着所以不会被回收,它最大用处两个,一个是可以读取函数内部变量,另一个就是让这些变量值始终保持在内存,不会在外部函数调用自动清除。...解决原理 对处理函数进行延时操作,若设定延时到来之前再次触发事件,则清除上一次延时操作定时器,重新定时。...3次握手:客户端再回传一个带有ACK标志数据包,表示知道了,握手结束。...then 方法接受两个参数,第一个参数是成功时回调, promise 由“等待”态转换到 “完成”态时调用,另一个是失败时回调, promise 由“等待”态转换到“拒绝”态时调用。...、递归递归函数实现深拷贝 递归递归就是一个函数调用其本身,通过栈来实现。每执行一个函数,就新建一个函数栈。

    48420

    前端-ES6promise实现原理

    好在计算机不是人,不是人,不是人,····正因为不是人,所以它许下承诺,它就一定会给你一个结果。 等待承诺实现过程很漫长,所以你可以做一些其它事情,没必要老是堵在这一条道上,也就是异步。...//do something; }) 然后你就可以调用then方法去取值,那么从这个角度看,这个构造函数一定是返回了一个带有then方法对象。...dosomething函数时,返回了一个带有then方法对象,然后then方法回调中去执行,现在看来是不是那么点样子了,时刻记得两件事,对象, then方法。...,还有什么事情要做,then方法回调函数我们希望得到promise值,这个值是fn函数调用resolve函数运算后得到,最终要在onResolved函数拿到,也就是说,我们必须在resolve...(res); }) 首先我们去new一个promise实例化过程调用了传进那个函数,3秒后才能执行到resolve,紧接着调用了它then方法,这个时候由于promise状态没变,肯定取不到值

    63620

    Promise机制

    Promise 解决过程 Promise 解决过程是一个抽象操作,其需输入一个 promise一个值,我们表示为 [[Resolve]](promise, x),如果 x then 方法且看上去像一个...链对象解决,而 [[Resolve]](promise, thenable) 递归性质又使得其再次调用,根据上述算法将会陷入无限递归之中。...jQuery 1.8 修正了这个问题,使 then 成为 pipe 同义词。不过,由于向后兼容问题, jQuery Promise如何对 Promises/A 示好也不太会招人待见。...此外, Promises/A 规范,由 then 方法生成 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用那个回调是返回值还是抛出错误。... JQuery Promise 对象回调抛出错误是个糟糕主意,因为错误不会被捕获。

    1.4K100

    Promises机制

    Promise 解决过程 Promise 解决过程是一个抽象操作,其需输入一个 promise一个值,我们表示为 [[Resolve]](promise, x),如果 x then 方法且看上去像一个...链对象解决,而 [[Resolve]](promise, thenable) 递归性质又使得其再次调用,根据上述算法将会陷入无限递归之中。...jQuery 1.8 修正了这个问题,使 then 成为 pipe 同义词。不过,由于向后兼容问题, jQuery Promise如何对 Promises/A 示好也不太会招人待见。...此外, Promises/A 规范,由 then 方法生成 Promise 对象是已执行还是已拒绝,取决于由 then 方法调用那个回调是返回值还是抛出错误。... JQuery Promise 对象回调抛出错误是个糟糕主意,因为错误不会被捕获。

    72640

    Promise机制详解

    Promise 解决过程 Promise 解决过程是一个抽象操作,其需输入一个 promise一个值,我们表示为 [Resolve],如果 x then 方法且看上去像一个 Promise ,...如果 then 不是函数,以 x 为参数执行 promise 如果 x 不为对象或者函数,以 x 为参数执行 promise 如果一个 promise 一个循环 thenable 链对象解决,...而 [Resolve] 递归性质又使得其再次调用,根据上述算法将会陷入无限递归之中。...jQuery 1.8 修正了这个问题,使 then 成为 pipe 同义词。不过,由于向后兼容问题, jQuery Promise如何对 Promises/A 示好也不太会招人待见。... JQuery Promise 对象回调抛出错误是个糟糕主意,因为错误不会被捕获。 最后一个例子揭示了,实现 Promise 关键是实现好 doResolve 方法,完事以后触发回调。

    1.5K70

    前端高频手写面试题

    => 递归递归退出条件:比较是两个值类型变量,直接用“===”判断比较两个变量之一为null,直接判断另一个元素是否也为null提前结束递推:两个变量keys数量不同传入两个参数是同一个变量递推工作...== y;};实现观察者模式观察者模式(基于发布订阅模式) 观察者,也有观察者观察者需要放到观察者观察者状态变化需要通知观察者 变化了 内部也是基于发布订阅模式,收集观察者,状态变化后要主动通知观察者...原理是维护一个计时器,规定在delay时间后触发函数,但是delay时间内再次触发的话,就会取消之前计时器而重新设置。这样一来,只有最后一次操作能触发。函数节流 :使得一定时间内只触发一次函数。...最大作用finally里函数,无论如何都会执行,并会把前面的值原封不动传递给下一个then方法如果finally函数中有promise等异步任务,会等它们全部执行完毕,再结合之前成功与否状态,返回值...普通值意味不是promise * * 1、then回调两个方法 成功或失败 他们结果返回(普通值)会传递给外层一个then * 2、可以成功或失败抛出异常,走到下一次then失败

    1.1K20

    如何序列化Js并发操作:回调,承诺和异步等待

    将展示一个以三种方式实现简单示例,首先是回调,然后是承诺,最后是异步/等待 对于这个例子,我们一个假设应用程序,可以自动将一些定制软件同时部署到多台计算机。...将它们连接在一起工作已经进入主流 为了实现这一点,我们修改了asyncTask来返回一个承诺这个怎么用?当异步操作结果准备就绪时,我们调用promiseresolve回调函数。...承诺一个方法,然后可以提供一个回调作为参数。当我们触发解析函数时,它会运行我们提供给promisethen方法回调函数 这使我们能够序列化我们异步操作。...当runTests完成时,我们只提供一个简单回调函数,只记录完成工作 通过从我们任务返回promise对象,我们可以将我们想要完成任务依次链接在一起 认为这个代码比回调示例更容易阅读 这也使得处理错误变得更容易...它像我们今天看到所有代码一样是非阻塞,所以其他东西可以等待表达式同时运行。然而,promise等待解决之前,下一行代码将不会运行。

    3.2K20

    JavaScript是如何工作:事件循环和异步编程崛起+ 5种使用 asyncawait 更好地编码方式!

    单线程环境编程缺陷以及如何解决这些缺陷来构建健壮JavaScript UI。按照惯例,本文最后,分享5个如何使用async/ wait编写更简洁代码技巧。 为什么单线程是一个限制?...发布第一篇文章,思考了这样一个问题:当调用堆栈中有函数调用需要花费大量时间来处理时会发生什么? 例如,假设在浏览器运行一个复杂图像转换算法。...现在只讨论这个概念,以便在讨论带有Promises异步行为时,能够了解 Promises 是如何调度和处理。 想像一下:任务队列是一个附加到事件循环队列每个标记末尾队列。...注意:因为Promise 一旦解析,它在外部是不可变,所以现在可以安全地将该值传递给任何一方,因为它不能意外地或恶意地修改,这一点多方遵守承诺决议时尤其正确。...当这个函数返回一个值时,这个值只是一个普通值而已,这个函数内部将自动创建一个承诺,并使用函数返回值进行解析。当这个函数抛出异常时,Promise 将被抛出值拒绝。

    3.1K20

    Javascript之也来手写一下Promise

    “reason”是一个用来表示Promise为什么reject原因,值。   就这些,但是稍微解释下,promise是指Promise这个整体,它可以是一个构造函数,也可以是个对象。...简单再总结下,首先我们声明了一个Promise类,然后这个一个实例方法then,这个then方法接收两个回调函数(后面我们会完善),然后整个类构造函数部分,声明了一个value和reason,...平台代码,就是指环境、引擎、或者promise实现代码,也就是说onFulfilled或者onRejected调用时候,只能是执行上下文栈最底层,它前面要么是全局、要么是另一个符合规范...如果一个promise一个参与循环thenable链thenable所resolved,这样[[Resolve]](promise,thenable)递归性质将最终导致再次调用[[Resolve...onFulfilled方法结果,这个x最终结果就是p2,所以此时resolvePromise(p, x, resolve, reject)方法p和x是同一个,那么Promise内部,我们要等待

    78440

    宏任务是异步还是同步?再谈事件循环

    先说得出结论:宏任务跟同步异步无关,可以是同步,也可以是异步,而微任务则全是异步。下面开始重头讲浏览器事件循环,希望对各位看官老爷帮助。举个栗子‍♀️关于事件循环一个很不错例子是早餐店。...JavaScript 对象分配在堆。栈(Stack):只能表尾进行插入或删除操作线性表,故数据后进先出。JavaScript 一个调用栈。...不过本文重点介绍它如何负责调度和执行在其线程运行每一段代码。调用 JavaScript 中使用了一个调用栈(Call Stack,也叫执行栈)机制来管理函数调用顺序。... JavaScript 开始运行时候,所有同步代码会按书写顺序调用依次执行,而异步任务回调函数则会被放入任务队列,等待执行。...执行递归函数时,调用栈是如何运作递归函数每一次递归调用时,都会生成新栈帧并压入调用栈。这意味着每一次递归调用栈都会增加一个新帧。

    14010

    JavaScript 权威指南第七版(GPT 重译)(五)

    调用者可以在这个承诺对象上注册一个或多个回调,当异步计算完成时,它们将被调用。 因此,最简单层面上,承诺只是一种与回调一起工作不同方式。然而,使用它们实际好处。...接下来小节将: 解释承诺术语并展示基本承诺用法 展示 Promises 如何链式调用 展示如何创建自己基于 Promise API 重要 起初,Promise 似乎很简单,事实上...如果多次调用 Promise 对象then()方法,每个指定函数都将在承诺计算完成时调用。...但是如果返回值v本身是一个 Promise,那么p解析但尚未实现。在这个阶段,p不能解决,直到 Promisev解决。如果v实现,那么p将被实现为相同值。...它是如何工作 ES6 及以后版本,Array()构造函数一个名为Symbol.species符号属性。(请注意,此 Symbol 用作构造函数属性名称。

    24210

    js手写前端需要掌握

    手写 new 操作符调用 new 过程中会发生以上四件事情:(1)首先创建了一个空对象(2)设置原型,将对象原型设置为函数 prototype 对象。...最大作用finally里函数,无论如何都会执行,并会把前面的值原封不动传递给下一个then方法如果finally函数中有promise等异步任务,会等它们全部执行完毕,再结合之前成功与否状态,返回值...普通值意味不是promise * * 1、then回调两个方法 成功或失败 他们结果返回(普通值)会传递给外层一个then * 2、可以成功或失败抛出异常,走到下一次then失败...但是这里又徒增了一个新问题,那就是Parent3构造函数会多执行了一次(Child3.prototype = new Parent3();)。这是我们不愿看到。那么如何解决这个问题?...promise 状态发生变化时(resolve / reject 调用时)再执行 then 里函数,我们使用一个 callbacks 数组先把传给then函数暂存起来,等状态改变时再调用

    1.9K30

    手动实现PromiseA+

    Promise 构造函数接收一个 exector 函数,当构造实例时,这个函数会 立即执行。下面一个初级版 promise 实现。...then 函数非常强大,可以链式调用,当前返回值可以作为下一个 then 接收值,而且 promsie 主要是为了解决异步回调问题。...链式调用可以说是 Promise 精华,了链式调用,你代码基本就不会再有回调地狱了!...then 方法返回三种: 成功回调或者失败回调抛出异常,会走到下一次 then 失败回调里; 成功或失败返回是还是一个 promise,那么会用这个 (返回promise 状态作为结果...即除了上面两种之外值,promise 会把这个值传递给外层一个 then 方法

    48510
    领券