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

定义为Promise的递归函数仅执行一次循环,求问题排查

问题分析与修复

你的代码只执行一次循环的核心原因是在第一个.then()回调里提前调用了resolve(globalMessageArray),这会直接结束当前receivingMessages创建的Promise,后续的.then()回调虽然存在,但此时Promise状态已经定型,递归调用不会被触发执行。

错误点拆解

  • 当client.send(command)成功后,你立刻调用了外层Promise的resolve,导致整个receivingMessages的Promise直接进入完成状态
  • 后续的.then()回调只是在已完成的Promise上追加逻辑,此时递归调用receivingMessages虽然被写了,但不会驱动循环执行

修复后的代码

推荐用async/await重构代码(async函数本身返回Promise,符合你的要求),逻辑更清晰易读:

let globalMessageArray = [];
let count = 0;
let loopFor = 20;

async function receivingMessages(params, loopFor, globalMessageArray) {
    try {
        const command = new ReceiveMessageCommand(params);
        const data = await client.send(command);
        
        if (data && data.Messages && data.Messages.length) {
            globalMessageArray.push(...data.Messages);
        }

        count += 1;
        console.log("Loop Count: " + count);

        if (loopFor === 1) {
            return globalMessageArray;
        } else {
            return receivingMessages(params, loopFor - 1, globalMessageArray);
        }
    } catch (error) {
        throw error;
    }
};

如果坚持用原生Promise链式调用,调整结构避免提前resolve:

let globalMessageArray = [];
let count = 0;
let loopFor = 20;

function receivingMessages(params, loopFor, globalMessageArray) {
    return new Promise((resolve, reject) => {
        const command = new ReceiveMessageCommand(params);
        client.send(command)
            .then(data => {
                if (data && data.Messages && data.Messages.length) {
                    globalMessageArray.push(...data.Messages);
                }

                count += 1;
                console.log("Loop Count: " + count);

                if (loopFor === 1) {
                    resolve(globalMessageArray);
                } else {
                    resolve(receivingMessages(params, loopFor - 1, globalMessageArray));
                }
            })
            .catch(error => {
                reject(error);
            });
    });
};

关键修复说明

  • 把递归判断和调用整合到client.send的成功回调内,避免提前结束当前Promise
  • 用push(...data.Messages)替代forEach+push,代码更简洁
  • async/await版本逻辑线性化,更易维护,且天然返回Promise满足要求

内容的提问来源于stack exchange,提问作者redvivi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:50:53