Reputation: 861
I am trying to chain promises but for some reason, my then method is not being called - can not find the reason why, assistance would be much appreciated. The then - .then((decodedTokenData) is not being called but instead the entire promise returned.
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);
});
});
};
EDIT : I understood my problem... I read the following documentation on Mozilla promises : Once a Promise is fulfilled or rejected, the respective handler function (onFulfilled or onRejected) will be called asynchronously (scheduled in the current thread loop). The behaviour of the handler function follows a specific set of rules. If a handler function:
returns a value, the promise returned by then gets resolved with the returned value as its value.
And I thought it applies to both promises and the then method - but it applies only to the then method ...
Upvotes: 0
Views: 80
Reputation: 2035
I'm not sure I understood right what are you doing here, but let me try.
When you do new Promise(() => ...whatever...
you create a promise that never resolves, so .then()
is never executed. The proper way to create a promise that resolves to some result is new Promise((res) => res(result))
.
Example in node:
> const p1 = new Promise(() => 1).then(console.log);
undefined
> p1
Promise { <pending> }
> const p2 = new Promise(res => res(1)).then(console.log);
undefined
> 1
Upvotes: 2
Reputation: 816840
new Promise
passes resolve
and reject
to the callback its passed, but you are not making use of it here:
const promise = new Promise(() => {
accessToken = event.header.authorization;
targetGroup = event.body.targetGroup;
let promise = decodeAndVerifyToken(accessToken);
return promise;
})
This creates a promise that is never resolved. There is no need for new Promise
here. Just call decodeAndVerifyToken
directly:
decodeAndVerifyToken(event.header.authorization)
.then((decodedTokenData) => { ... })
...
Upvotes: 2