我在调试使用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!
答案 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))
。