Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 带有.catch()的未处理承诺拒绝_Javascript_Amazon Web Services_Ecmascript 6_Promise - Fatal编程技术网

Javascript 带有.catch()的未处理承诺拒绝

Javascript 带有.catch()的未处理承诺拒绝,javascript,amazon-web-services,ecmascript-6,promise,Javascript,Amazon Web Services,Ecmascript 6,Promise,我调试第一个使用承诺的Javascript工具时遇到了问题。我觉得我正确地使用了.catch方法,因为它与其他针对类似问题的StackOverflow答案相匹配,但是我仍然会收到一个未处理的Promisejection警告,用于未捕获的承诺 我的程序从S3获取对象列表,然后将它们记录到控制台 这是承诺链 s3Helper.setCredentials(program.profile) .then(s3Helper.findObjects([], null)) .then(data =&g

我调试第一个使用承诺的Javascript工具时遇到了问题。我觉得我正确地使用了.catch方法,因为它与其他针对类似问题的StackOverflow答案相匹配,但是我仍然会收到一个未处理的Promisejection警告,用于未捕获的承诺

我的程序从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.setCredentials(program.profile)
  .then(() => s3Helper.findObjects([], null))
  .then(data => console.log(data))
  .catch(err => util.error(err));
注意函数:=>。。。在第二行

Then.Then方法将函数作为其参数。所以你必须给它传递一个函数


因此,.thens3Helper.findObjects[],null仅在s3Helper.findObjects[]返回函数时才起作用。但是根据您对s3Helper.findObjects[]的定义,null不是。因此,您需要将.then方法更新为.then=>s3Helper.findObjects[],null。

错误发生在哪里?除非s3Helper.findObjects[],null返回函数,否则将无法工作。您可能想说.then=>s3Helper.findObjects[],null。但是在catch语句中,您可能还表示util.error而不是utl.error。因此,您的catch正在生成另一个错误,而该错误不是由另一个catch链处理的。@FrankerZ只是一个不推荐的调用,相当于console.error.utl是我正在使用的一个单独的库,但感谢您的建议!。然后fn,就像setTimeoutfn,d一样,需要一个函数在完成任务时调用。相反,您调用了该函数,因此立即执行它,而不是等待承诺得到解决。谢谢!我所做的和这种方法有什么区别?我的印象是,如果不返回任何没有括号和粗箭头的参数,就可以调用函数。所以你必须给它传递一个函数。看看我上面更新的答案。