Promise链式调用问题:已resolve的Promise未触发then方法
问题排查与修复:Promise链式调用未触发
.then回调 首先,你的核心问题出在第一个Promise的错误构造方式上,这直接导致后续的.then回调完全没机会执行。我们一步步拆解问题:
核心错误:外层Promise从未被resolve/reject
你写的第一个Promise是这样的:
const promise = new Promise(() => { accessToken = event.header.authorization; targetGroup = event.body.targetGroup; let promise = decodeAndVerifyToken(accessToken); return promise; })
Promise构造函数的回调函数接收resolve和reject两个参数,只有调用这两个方法,Promise的状态才会从pending变为fulfilled或rejected,后续的.then/.catch才会触发。你在这里只是返回了内部的decodeAndVerifyToken Promise,但外层Promise一直处于pending状态,所以链式调用直接卡在这里了。
其他需要修复的错误点
除了核心问题,代码里还有几个拼写和变量错误:
- 拼写错误:
setUserGroup里的Prmoise应该是Promise,resove应该是resolve;isNotGroupMember里的include是数组方法includes(少了个s)。 - 变量引用错误:第一个
.then里的result.userGroups根本没定义,而且setUserGroup的参数顺序不对(它需要username作为第一个参数,不是userGroups)。 - 冗余代码:外层没必要单独定义
promise变量,直接返回链式调用的结果更简洁。 - 错误处理缺失:链式调用没有添加
.catch,容易出现未处理的Promise拒绝错误。
修正后的完整代码
let handler = async (event) => { const accessToken = event.header.authorization; const targetGroup = event.body.targetGroup; return decodeAndVerifyToken(accessToken) .then((decodedTokenData) => { // 检查用户是否不在目标组(可根据需求添加后续逻辑) const isNotGroupMemberResult = isNotGroupMember(decodedTokenData.userGroups); // 修正setUserGroup的参数顺序:username, groupname, userPoolId return setUserGroup(decodedTokenData.username, targetGroup, userPoolId); }) .then(() => { return true; }) .catch(err => { console.error('流程执行出错:', err); throw err; // 或返回错误响应,根据业务需求调整 }); } let decodeAndVerifyToken = (jwtToken) => { return new Promise((resolve, reject) => { jwt.verify(jwtToken, pem, function (err, dToken) { if (err) { return reject(err); // 加return避免后续代码执行 } const userGroups = dToken?.["cognito:groups"] || []; const username = dToken?.username || null; const retval = { userGroups, username, decodedToken: dToken } resolve(retval); }) }); } let isNotGroupMember = (userGroups) => { // 修正includes拼写,确保reviewersGroup/ownersGroup已提前定义 const groupIndex = userGroups.findIndex(groupName => groupName.includes(reviewersGroup) || groupName.includes(ownersGroup) ); return groupIndex === -1; } let setUserGroup = (username, groupname, userPoolId) => { // 修正Promise和resolve的拼写 return new Promise((resolve, reject) => { const params = { GroupName: groupname, UserPoolId: userPoolId, Username: username }; cognitoidentityserviceprovider.adminAddUserToGroup(params, function (err, data) { if (err) { return reject(err); } resolve(data); }); }); };
关于你补充的文档理解
你提到的Mozilla文档里的规则是对的,但你的问题和这个规则无关——你的链式调用根本没触发,是因为第一个Promise从未改变状态。当你直接返回decodeAndVerifyToken(accessToken)(它本身就是一个Promise),后续的.then就会在它resolve后正常执行了。
内容的提问来源于stack exchange,提问作者James Roeiter
相关产品推荐
相关产品推荐

