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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:08:06