You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

递归调用Promise函数异常:结果重复且控制台未输出日志

问题分析与修复方案

看起来你这段递归调用Promise的代码踩了几个常见的坑,导致了重复拼接和日志无法输出的问题,我来帮你梳理并修复:

核心问题拆解

  1. 语法错误直接阻断执行:你写的then(function (data))多了一个右括号,正确写法应该是then(function(data) { ... }),这个语法错误会让代码直接报错,自然不会执行后续的console.log。
  2. 递归Promise链没正确串联:原代码的递归逻辑没等待前一次Promise完成就触发了下一次调用,而且没设置终止条件,导致重复获取片段;同时getSentence里的Promise没有在递归结束后正确resolve,导致then回调永远不会触发。
  3. 全局变量拼接逻辑混乱:全局的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:03:47