Javascript 带有.catch()的未处理承诺拒绝
我调试第一个使用承诺的Javascript工具时遇到了问题。我觉得我正确地使用了.catch方法,因为它与其他针对类似问题的StackOverflow答案相匹配,但是我仍然会收到一个未处理的Promisejection警告,用于未捕获的承诺 我的程序从S3获取对象列表,然后将它们记录到控制台 这是承诺链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
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一样,需要一个函数在完成任务时调用。相反,您调用了该函数,因此立即执行它,而不是等待承诺得到解决。谢谢!我所做的和这种方法有什么区别?我的印象是,如果不返回任何没有括号和粗箭头的参数,就可以调用函数。所以你必须给它传递一个函数。看看我上面更新的答案。