异步递归生成用户名函数返回undefined问题求助
问题根源与解决方案
问题出在异步递归调用时没有返回递归函数的执行结果。
异步函数的本质是返回Promise,当你需要递归重新生成用户名时,如果只是调用generateUsername()而不把它的返回值(也就是Promise)return出去,当前的函数会直接resolve成undefined——因为没有明确return任何值。而递归后续生成的有效用户名,会因为没有被上层Promise接收,导致最终newUsername拿到undefined。
举个错误写法的例子:
async function generateUsername() { const username = randomGenerate(); // 自定义的随机生成逻辑 const isExists = await checkDbForUsername(username); // 异步检查数据库 if (isExists) { // 错误:只调用递归,但没返回这个Promise generateUsername(); } else { return username; } }
修正后的写法,核心就是return递归调用的结果:
async function generateUsername() { const username = randomGenerate(); const isExists = await checkDbForUsername(username); if (isExists) { // 正确:返回递归的Promise,让上层await等待递归完成 return generateUsername(); } else { return username; } }
这样每次递归都会把新的Promise传递回去,上层的await generateUsername()会一直等待,直到拿到那个未被占用的用户名,而不是提前拿到undefined。
额外提醒:最好给递归加个重试次数上限,比如最多重试10次,避免极端情况下(比如所有随机生成的用户名都被占用)陷入无限递归。
内容的提问来源于stack exchange,提问作者JohnBradens
相关产品推荐
相关产品推荐

