链式承诺-返回的承诺解决不会导致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,data) {
        if (err) {
            reject(err);
        } else
            resolve(data);
    });
});
};

编辑: 我了解我的问题...阅读了有关Mozilla Promise的以下文档: 一旦Promise被实现或拒绝,相应的处理函数(onFulfilled或onRejected)将被异步调用(在当前线程循环中调度)。处理程序功能的行为遵循一组特定的规则。如果是处理程序函数:

returns a value,the promise returned by then gets resolved with the returned value as its value.

我认为它同时适用于promise和then方法-但仅适用于then方法...

bati0229 回答:链式承诺-返回的承诺解决不会导致then方法被调用

new Promiseresolvereject传递给它传递的回调,但是您在这里没有使用它:

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) => { ... })
  ...
,

我不确定我是否理解你在这里做什么,但让我尝试一下。

当您执行new Promise(() => ...whatever...时,您会创建一个永远无法解决的承诺,因此.then()永远不会执行。创建可以解决某些问题的承诺的正确方法是new Promise((res) => res(result))

节点中的示例:

> const p1 = new Promise(() => 1).then(console.log);
undefined
> p1
Promise { <pending> }
> const p2 = new Promise(res => res(1)).then(console.log);
undefined
> 1
本文链接:https://www.f2er.com/2839942.html

大家都在问