【问题标题】:Chain promises - returned promise resolve does not cause then method to be invoked链式承诺 - 返回的承诺解析不会导致调用 then 方法
【发布时间】:2019-12-30 12:52:15
【问题描述】:

我正在尝试链接承诺,但由于某种原因,我的 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 承诺的以下文档: 一旦一个 Promise 被实现或拒绝,相应的处理函数(onFulfilled 或 onRejected)将被异步调用(在当前线程循环中调度)。处理函数的行为遵循一组特定的规则。如果是处理函数:

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

我认为它适用于 promises 和 then 方法——但它只适用于 then 方法......

【问题讨论】:

    标签: javascript ecmascript-6 es6-promise


    【解决方案1】:

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

    当你执行new Promise(() => ...whatever... 时,你创建了一个永远不会解析的承诺,所以.then() 永远不会被执行。创建可解析为某些结果的 Promise 的正确方法是 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
    

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 2020-04-27
        • 1970-01-01
        • 1970-01-01
        • 2016-06-15
        • 1970-01-01
        • 2016-03-09
        • 2018-02-15
        • 1970-01-01
        • 2020-07-30
        相关资源
        最近更新 更多