【问题标题】:Unhandled Promise Rejection with a .catch() [duplicate]使用 .catch() 处理未处理的 Promise Rejection [重复]
【发布时间】:2018-01-17 23:04:53
【问题描述】:

我在调试我的第一个使用 Promise 的 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!

【问题讨论】:

  • 哪里出错了?
  • 除非s3Helper.findObjects([], null) 返回一个函数,否则这是行不通的。你可能想说.then(() => s3Helper.findObjects([], null))。但是在您的 catch 语句中,您可能还指的是 util.error() 而不是 utl.error()。因此,您的 catch() 正在生成另一个错误,该错误未被另一个 catch() 链处理。
  • @FrankerZ util.error() 只是一个已弃用的调用,相当于console.error()
  • utl 是我正在使用的独立库,但感谢您的建议!
  • .then(fn),就像setTimeout(fn,d),需要一个函数在它完成它的事情时调用。相反,您调用了该函数,因此立即执行它,而不是等待 promise 解决。

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


【解决方案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))

【讨论】:

  • 谢谢!我在做什么和这种方法有什么区别?我的印象是,如果您没有返回任何没有括号和粗箭头的参数,您可以调用一个函数
  • 然后.then() 方法接受一个函数作为它的参数。所以你必须给它传递一个函数。看看我上面的更新答案。
猜你喜欢
  • 2021-08-08
  • 2018-01-11
  • 1970-01-01
  • 1970-01-01
  • 2019-11-10
  • 2020-03-01
  • 2020-09-13
  • 2018-03-19
  • 2018-04-12
相关资源
最近更新 更多