递归调用Promise函数异常:结果重复且控制台未输出日志
问题分析与修复方案
看起来你这段递归调用Promise的代码踩了几个常见的坑,导致了重复拼接和日志无法输出的问题,我来帮你梳理并修复:
核心问题拆解
- 语法错误直接阻断执行:你写的
then(function (data))多了一个右括号,正确写法应该是then(function(data) { ... }),这个语法错误会让代码直接报错,自然不会执行后续的console.log。 - 递归Promise链没正确串联:原代码的递归逻辑没等待前一次Promise完成就触发了下一次调用,而且没设置终止条件,导致重复获取片段;同时
getSentence里的Promise没有在递归结束后正确resolve,导致then回调永远不会触发。 - 全局变量拼接逻辑混乱:全局的
sentence在递归中被多次重复赋值,没有和Promise的串行执行绑定,导致出现重复内容。
修复后的完整代码
let sentence = ''; // 修正语法错误,添加错误捕获 getSentence().then(() => { console.log(sentence); // 现在会正确输出"helloworld" }).catch(err => { console.error('获取句子失败:', err); }); function getSentence(nextToken) { return new Promise((resolve, reject) => { service.getSentenceFragment(nextToken) .then(fragmentResult => { // 假设接口返回的结构是 { content: 片段内容, nextToken: 下一页标识,无内容时为null } if (!fragmentResult.content) { // 没有更多片段,终止递归并resolve resolve(); return; } // 正确拼接片段 sentence += fragmentResult.content; // 递归调用,等待递归完成后再resolve当前Promise,保证串行执行 getSentence(fragmentResult.nextToken).then(resolve).catch(reject); }) .catch(reject); }); }
更优雅的无全局变量版本
如果你不想用全局变量,可以通过递归参数传递当前拼接的内容,代码更简洁且无副作用:
getSentence().then(completeSentence => { console.log(completeSentence); // 输出"helloworld" }).catch(err => { console.error('获取句子失败:', err); }); function getSentence(nextToken, currentSentence = '') { return service.getSentenceFragment(nextToken) .then(fragmentResult => { if (!fragmentResult.content) { return currentSentence; } const newSentence = currentSentence + fragmentResult.content; // 递归传递更新后的句子和下一页标识 return getSentence(fragmentResult.nextToken, newSentence); }); }
内容的提问来源于stack exchange,提问作者cyorkston
相关产品推荐
相关产品推荐

