javascript - 链式承诺 - 返回的承诺解析不会导致调用 then 方法
问题描述
我正在尝试链接承诺,但由于某种原因,我的 then 方法没有被调用 - 找不到原因,非常感谢您的帮助。then - .then((decodedTokenData) 没有被调用,而是返回了整个承诺。
let handler = async (event) => {
let accessToken = undefined;
let targetGroup = undefined;
const promise = new Promise(() => {
accessToken = event.header.authorization;
targetGroup = event.body.targetGroup;
let promise = decodeAndVerifyToken(accessToken);
return promise;
}).then((decodedTokenData) => {
let isNotGroupMemberResult = isNotGroupMember(decodedTokenData.userGroups);
return setUserGroup(result.userGroups, targetGroup, userPoolId);
}).then(() => {
return true;
});
return promise;
}
let decodeAndVerifyToken = (jwtToken) => {
return new Promise((resolve, reject) => {
jwt.verify(jwtToken, pem, function (err, dToken) {
if (err) {
reject(err);
}
let userGroups = dToken && dToken["cognito:groups"] ? dToken["cognito:groups"] : [];
let username = dToken && dToken.username ? dToken.username : null;
let retval = {
userGroups,
username,
decodedToken: dToken
}
resolve(retval);
})
});
}
let isNotGroupMember = (userGroups) => {
let groupIndex = userGroups.findIndex(groupName => groupName.include(reviewersGroup) || groupName.include(ownersGroup));
let isNotGroupMemberRetval = groupIndex == -1;
return isNotGroupMemberRetval;
}
let setUserGroup = (username, groupname, userPoolId) => {
return new Prmoise((resove, reject) => {
var params = {
GroupName: groupname,
UserPoolId: userPoolId,
Username: username
};
cognitoidentityserviceprovider.adminAddUserToGroup(params, function (err, data) {
if (err) {
reject(err);
} else
resolve(data);
});
});
};
编辑:我理解我的问题......我阅读了有关 Mozilla 承诺的以下文档:一旦承诺被履行或拒绝,相应的处理程序函数(onFulfilled 或 onRejected)将被异步调用(在当前线程循环中调度)。处理函数的行为遵循一组特定的规则。如果处理函数:
returns a value, the promise returned by then gets resolved with the returned value as its value.
而且我认为它适用于承诺和 then 方法 - 但它仅适用于 then 方法......
解决方案
new Promise
传递resolve
并传递reject
给回调,但您没有在这里使用它:
const promise = new Promise(() => {
accessToken = event.header.authorization;
targetGroup = event.body.targetGroup;
let promise = decodeAndVerifyToken(accessToken);
return promise;
})
这会创建一个永远不会解决的承诺。这里没有必要new Promise
。直接调用decodeAndVerifyToken
即可:
decodeAndVerifyToken(event.header.authorization)
.then((decodedTokenData) => { ... })
...
推荐阅读
- maven - Maven 在特定执行中继承 false
- java - 根据java中的日期名称从windows路径中选择文件夹
- python - 如何验证组是否已成功添加到python中的文件夹
- python - 扫描列表(文本,视为类似字节)并在项目不存在时追加(Python)
- android - 我正在尝试单击活动,但它在 android studio 中显示错误
- javascript - 正则表达式只允许两个下划线,没有其他特殊符号并且前一个或下一个字符应该是数字或字母
- c++ - 有人可以解释一下这段代码,它会生成给定集合的所有可能排列吗?
- wordpress - 错误 415 不支持提供的内容类型使用 IBM Cloud 文档翻译
- java - Selenium 在 eclipse 上工作,在 jenkins 上超时
- spring-boot -
容器启动时出现“通信链路故障”