我是Nodejs的新手,很难理解这个问题:我试图对数组运行一个describe函数,并且AWS函数似乎在main函数完成后运行。
这是主要功能:(通过ACM ARN列表循环并检查状态)
var checkCertStatus = function(resolveObj){
var promise = new Promise(function(resolve, reject){
console.log('1');
var retObj='';
resolveObj.Items.forEach(function(element) {
var certDescribeParams = {
CertificateArn: element.sslCertId
};
console.log('2');
acm.describeCertificate(certDescribeParams, function(err, data) {
if(err) reject(new Error(err));
else {
console.log(data.Certificate.DomainName + ': ' + data.Certificate.Status);
retObj+=data;
}
});
});
console.log('3');
resolve(retObj);
return promise;
})
}
基于调试日志,假设有2项需要处理,我得到了:
1
2
2
3
example.com: ISSUED
example2.com: ISSUED
基本上,我需要将此结果传递给链中的下一个函数(带有promise和stuff)。
最佳答案
欢迎使用Node.js!一般来说,学习异步编程风格可能会有所帮助。特别是,您似乎混用了Promises和callbacks,这可能会使此示例比需要的更加混乱。我建议使用AWS开发工具包的内置功能将响应转换为Promises。
我注意到的第一件事是您正在手动构建带有“解决/拒绝”功能的Promise。除非您正在创建库,否则这通常是一个危险信号。其他大多数库都支持Promises,您可以简单地使用和链接。 (如上所述,其中包括AWS开发工具包。)
我注意到的第二件事是您的checkCertStatus
函数不返回任何内容。它创建一个Promise,但最后不返回。您的return promise;
行实际上位于用于创建Promise的回调函数中。
就个人而言,在使用Promises时,我更喜欢使用Bluebird库。它提供的功能比本地功能更多的Promises,包括诸如map之类的方法。方便地,可以将AWS SDK配置为通过AWS.config.setPromisesDependency()
与替代的Promise构造函数一起使用,如here所述。
为了简化您的逻辑,您可以尝试以下方法(未经测试的代码):
const Promise = require('bluebird');
AWS.config.setPromisesDependency(Promise);
const checkCertStatus = (resolveObj) => {
const items = resolveObj.Items;
console.log(`Mapping ${items.length} item(s)`);
return Promise.resolve(items)
.map((item) => {
const certDescribeParams = {
CertificateArn: item.sslCertId,
};
console.log(`Calling describeCertificate for ${item.sslCertId}`);
return acm.describeCertificate(certDescribeParams)
.promise()
.then((data) => {
console.log(`${data.Certificate.DomainName}: ${data.Certificate.Status}`);
return data;
});
});
};
我们将
checkCertStatus
定义为接受resolveObj
并从resolveObj.Items
开始返回Promise链的函数。 (如果您还不熟悉Arrow Functions,我深表歉意。)此链中的第一步也是唯一的步骤是将items
数组映射到从acm.describeCertificate
方法返回的Promises新数组。如果这些个人承诺中的任何一个失败,那么顶级承诺链也会拒绝。否则,顶级Promise链将解析为一系列结果。 (请注意,我包括了一个无关紧要的.then
步骤,用于记录各个结果,但是您可以完全删除该子句。)希望这会有所帮助,如果我在代码中留下任何错误,我深表歉意。