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

Angular中如何将amazon-cognito-identity-js回调转为Promise

问题描述

我正在使用amazon-cognito-identity-js,现有代码如下:

cognitoUser?.getUserAttributes((err, results) => {
  if (err) {
    console.log(err.message || JSON.stringify(err));
    return err.message || JSON.stringify(err);
  }
  if (results != undefined) {
    return results[2].Value;
  }
  return undefined;
});

我能打印出results[2]的正确值,但无法返回该值。尝试过util-promisify但该包适配Webpack,请问在Angular应用中如何改用Promise实现?

getUserAttributes()的声明如下:

public getUserAttributes(
callback: NodeCallback<Error, CognitoUserAttribute[]>
): void;
解决方案

不用依赖第三方包,直接手动封装原生Promise即可,Angular环境完全支持这种写法:

function getUserAttributesPromise(cognitoUser: CognitoUser): Promise<string | undefined> {
  return new Promise((resolve, reject) => {
    cognitoUser.getUserAttributes((err, results) => {
      if (err) {
        const errorMsg = err.message || JSON.stringify(err);
        console.log(errorMsg);
        reject(errorMsg);
        return;
      }
      resolve(results?.[2]?.Value);
    });
  });
}

封装完成后,你可以用两种方式调用:

方式1:async/await(代码更简洁直观)

// 必须在async标记的函数内使用
async function fetchTargetAttribute() {
  try {
    const targetValue = await getUserAttributesPromise(cognitoUser);
    // 在这里拿到返回值做后续处理
    console.log(targetValue);
  } catch (error) {
    // 捕获并处理错误
    console.error(error);
  }
}

方式2:.then()链式调用

getUserAttributesPromise(cognitoUser)
  .then(targetValue => {
    console.log(targetValue);
    // 后续业务逻辑
  })
  .catch(error => {
    console.error(error);
  });

关键说明

原回调里的return无法把值传到外部,因为回调是异步执行的,外部代码不会等待它执行完毕。用Promise封装后,通过resolve传递结果、reject抛出错误,外部就能通过异步语法获取到返回值,同时规范处理错误。

内容的提问来源于stack exchange,提问作者devteamatl

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 10:40:40