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

时间:2018-01-17 23:04:53

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

我在调试使用promises的第一个Javascript工具时遇到问题。我觉得我正在正确使用.catch()方法,因为它与其他StackOverflow对已经提出的类似问题的答案相匹配,但是我还是会收到未处理的承诺的UnhandledPromiseRejectionWarning。

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

这是承诺链

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

这是两个承诺

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!

1 个答案:

答案 0 :(得分:1)

您的承诺链应如下所示:

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

注意功能:()=> ......在第二行

然后.then()方法接受一个函数作为它的参数。所以你必须传递一个函数。

因此,.then(s3Helper.findObjects([], null))仅在s3Helper.findObjects([], null)返回函数时才有效。但根据你对s3Helper.findObjects([], null)的定义,它没有。因此,您需要将.then()方法更新为.then(() => s3Helper.findObjects([], null))