【发布时间】: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