定义为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
相关产品推荐
相关产品推荐

