递归异步函数中添加then为何返回undefined?
问题原因分析
你的代码出现问题的核心原因在于**then回调没有返回递归调用的结果**,同时错误处理的逻辑也可能导致函数返回undefined,咱们一步步拆解:
then回调的返回值问题
当你在foo(n-1)后面链式调用.then(result => { bar(); })时,then方法会创建一个新的Promise。这个新Promise的resolved值完全由回调函数的返回值决定——如果回调没有显式返回任何内容,就会默认返回undefined。
所以你await这个Promise时,得到的不是foo(n-1)的返回值,而是undefined,最终return n + undefined的结果自然不符合预期,甚至会变成NaN。错误处理的隐性问题
你的catch块只做了console.log(e),没有返回值也没有重新抛出错误。如果递归过程中触发了异常(比如传入负数n),函数会默认返回undefined,这也是你看到整体返回undefined的可能原因之一。
解决方案
根据你的需求(获取递归返回值+执行bar()),有两种清晰的写法:
方案一:用await替代then(推荐,更符合async/await的风格)
既然已经用了async/await,完全可以把递归调用和后续操作分开写,可读性更强:
async function foo(n) { try { if (n == 0) { return 0; } // 先获取递归调用的结果 const recursiveResult = await foo(n - 1); // 执行你需要的bar()操作 bar(); // 基于结果计算并返回 return n + recursiveResult; } catch (e) { console.log(e); // 这里建议要么返回一个默认值,要么重新抛出错误 // 避免异常时函数返回undefined throw e; // 或者 return -1; 根据你的业务需求调整 } }
方案二:修正then回调的返回值(如果一定要用then链)
如果你坚持要用then,只需要在回调里把result返回出去,让Promise链传递正确的值:
async function foo(n) { try { if (n == 0) { return 0; } return n + await foo(n - 1) .then(result => { bar(); return result; // 关键:把递归结果返回,让Promise链传递这个值 }); } catch (e) { console.log(e); throw e; // 同样处理错误,避免返回undefined } }
内容的提问来源于stack exchange,提问作者Dyzzet
相关产品推荐
相关产品推荐

