首页
学习
活动
专区
工具
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 方法被调用后将创建一个新的栈,这个我们后续处理,先正常往下看

41630

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

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

24030
  • 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 的最大特点就是让函数的运行,可以暂停,不要小看他,有了这个暂停,我们能做的事情就太多,在调用异步代码时

    83830

    一杯喜茶的时间手搓Promise

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

    77240

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

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

    3.3K60

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

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

    48720

    前端-ES6中promise的实现原理

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

    64320

    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 对象的回调中抛出错误是个糟糕的主意,因为错误不会被捕获。

    72940

    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.2K20

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

    我将展示一个以三种方式实现的简单示例,首先是回调,然后是承诺,最后是异步/等待 对于这个例子,我们有一个假设的应用程序,可以自动将一些定制软件同时部署到多台计算机。...将它们连接在一起的工作已经进入主流 为了实现这一点,我们修改了asyncTask来返回一个承诺。 这个怎么用?当异步操作的结果准备就绪时,我们调用promise的resolve回调函数。...承诺有一个方法,然后可以提供一个回调作为参数。当我们触发解析函数时,它会运行我们提供给promise的then方法的回调函数 这使我们能够序列化我们的异步操作。...当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内部,我们要等待

    83140

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

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

    15411

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

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

    24610

    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 方法中。

    49110
    领券