我在调试我的第一个使用 Promise 的 Javascript 工具时遇到了麻烦。我觉得我正确使用了 .catch() 方法,因为它与其他 StackOverflow 对已提出的类似问题的答案相匹配,但是我仍然收到未捕获的 promise 的 UnhandledPromiseRejectionWarning。
我的程序从 S3 获取对象列表,然后将它们记录到控制台。
这是 promise 链
s3Helper.setCredentials(program.profile)
.then(s3Helper.findObjects([], null))
.then(data => console.log(data))
.catch(err => utl.error(err));
这是两个 promise
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!
最佳答案
你的 promise 链应该是这样的:
s3Helper.setCredentials(program.profile)
.then(() => s3Helper.findObjects([], null))
.then(data => console.log(data))
.catch(err => util.error(err));
注意第二行的函数:() => ...
Then .then()
方法采用函数作为参数。所以你必须向它传递一个函数。
因此,.then(s3Helper.findObjects([], null))
仅当 s3Helper.findObjects([], null)
返回一个函数时才有效。但根据您对 s3Helper.findObjects([], null) 的定义,事实并非如此。因此,您需要将 .then()
方法更新为 .then(() => s3Helper.findObjects([], null))
。
关于javascript - 使用 .catch() 处理未处理的 Promise 拒绝,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48311411/