javascript - 使用 .catch() 处理未处理的 Promise 拒绝

标签 javascript amazon-web-services ecmascript-6 promise

我在调试我的第一个使用 Promise 的 Javascript 工具时遇到了麻烦。我觉得我正确使用了 .catch() 方法,因为它与其他 StackOverflow 对已提出的类似问题的答案相匹配,但是我仍然收到未捕获的 promise 的 UnhandledPromiseRejectionWarning。

我的程序从 S3 获取对象列表,然后将它们记录到控制台。

这是 promise 链

s3Helper.setCredentials(program.profile)
  .then(s3Helper.findObjects([], null))
  .then(data => console.log(data))
  .catch(err => utl.error(err));

这是两个 promise

function findObjects (keyArray, token) {
  return new Promise((resolve, reject) => {
    var S3 = new AWS.S3({apiVersion: '2006-03-01'});
    var params = {
      Bucket: program.bucket,
      Prefix: program.prefix,
      Delimiter: program.recursive ? '' : '/',
      ContinuationToken: token
    };

    S3.listObjectsV2(params, (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

function setCredentials (profile) {
  // Sets AWS credentials, and rejects if the profile is not found
  return new Promise((resolve, reject) => {
    AWS.config.credentials = new AWS.SharedIniFileCredentials({profile: profile});
    AWS.config.credentials.refresh((err, data) => {
      if (err) {
        reject(err);
      } else if (AWS.config.credentials.accessKeyId) {
        resolve();
      } else if (AWS.config.credentials.roleArn) {
        resolve();
      } else {
        var error = {
          message: `Given profile '${program.profile}' does not exist`
        };
        reject(error);
      }
    });
  });
}

抱歉,如果我的风格或代码不好,我还在适应 Javascript!

最佳答案

你的 promise 链应该是这样的:

s3Helper.setCredentials(program.profile)
  .then(() => s3Helper.findObjects([], null))
  .then(data => console.log(data))
  .catch(err => util.error(err));

注意第二行的函数:() => ...

Then .then() 方法采用函数作为参数。所以你必须向它传递一个函数。

因此,.then(s3Helper.findObjects([], null)) 仅当 s3Helper.findObjects([], null) 返回一个函数时才有效。但根据您对 s3Helper.findObjects([], null) 的定义,事实并非如此。因此,您需要将 .then() 方法更新为 .then(() => s3Helper.findObjects([], null))

关于javascript - 使用 .catch() 处理未处理的 Promise 拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48311411/

相关文章:

amazon-web-services - 无法使用 cloudformation 创建 AWS ServiceCatalogProduct

ruby - 如何在 Ubuntu 14.04 中为 Vagrant 安装 Ruby 版本 >= 2.0?

javascript - JS regex positive look behind * 应该什么时候不贪心?

javascript - 从对象数组中删除重复元素 - es6?

javascript - 浏览器嗅探用户的历史 - 就此结束?

javascript - 如何从数据表的列中删除默认的点击事件?

javascript - 当 select 标签具有 size 属性时,HTML Select change 事件在 Chrome 中的滚动条点击时触发

javascript - 如何将数组分成随机对的数组(不重复)?

amazon-web-services - 用于从 Auto Scaling 组中获取实例并依次获取该实例的主机名的脚本

typescript - 如何获取 TypeScript Map<k, v> 的长度?(错误 : Map. size gives undefined)