我想以 promise 的方式重写一个脚本,该脚本之前使用回调来创建 ec2 实例。我的逻辑是首先尝试描述 securityGroups。如果不存在,则创建一个,否则继续描述 key 对。如果 key 对不存在,则创建一个 key 对并将私钥写入文件,否则继续创建实例。
不知何故,我设法按照下面的方式这样做,但我对代码的平坦性不满意。还是有很多凹痕。此外,我发现我的逻辑迫使我将链式 Promise 嵌套在 catch block 中,这不是人们在那些教程中通常所做的方式,从而使我怀疑使用 Promise 的方式和最初目的。
var describeSecurityGroupsInstance = ec2.describeSecurityGroups(securityGroups).promise()
//1st level chain
describeSecurityGroupsInstance.then(function(data){
console.log("SecurityGroups Already Exist")
}).catch(function(err){
console.log("Unable to describe SecurityGroup", err)
var createSecurityGroupInstance = ec2.createSecurityGroup(securityGroup).promise()
//2nd level chain
createSecurityGroupInstance.then(function(data){
console.log("SecurityGroup test created")
var describeKeyPairsInstance = ec2.describeKeyPairs(keyPairs).promise()
return describeKeyPairsInstance
}).then(function(data){
console.log("KeyPair Already Exist, make sure you have private key locally to proceed")
}).catch(function(err){
console.log("Unable to describe KeyPairs", err)
var createKeyPairInstance = ec2.createKeyPair(keyPair).promise()
//3rd level chain
createKeyPairInstance.then(function(data){
console.log("KeyPair test created")
const writeFileInstance = util.promisify(fs.writeFile)
privateKey=data.KeyMaterial
return writeFileInstance('test.pem',privateKey)
}).then(function(data){
console.log("keypair content write to file")
var instancePromise = ec2.runInstances(instanceParams).promise()
return instancePromise
}).then(function(data){
console.log("instance just created")
console.log(data)
}).catch(function(err){
console.log("Unable to create KeyPair or unable to write to file or create instance", err, err.stack)
})
})
})
所以现在,我有 3 层 promise 链。
我的第一个问题是我是否能够在 describeSecurityGroupsInstance
的 catch block 之后将 describeKeyPairsInstance
promise 放入顶级链中,因为从逻辑上讲,在检查 securityGroup 后,我们应该检查 KeyPairs或相反。(IMO,这两个步骤之间的顺序并不重要,如果我错了,请纠正我)。基本上,我可以忍受嵌套链来解决 securityGroups 不存在的问题,因为它是必须的,但不是 describeKeyPairsInstance
部分。如果这个目标能够实现,我认为 writeFileInstance 也可以追加到顶级链,那么问题就解决了。所以问题就变成了如何将 Promise 从二级链返回到顶层链。目前虽然我认为这不可行,但如果有解决方案我真的很感激。
我的第二个问题是创建 ec2 实例本身的逻辑。我是否应该简单地摆脱 describeSecurityGroups/KeyPairs
这两个 promise ,而不是根据 createSecurityGroup/KeyPair
promise 的拒绝来检查是否存在?如果是这样,那么无论 securityGroup 和 keyPair 是否存在,我都可以进行链式 promise 。但从幂等的 Angular 来说,我们不应该先检查是否存在吗?
我的第三个问题是关于 Promise 的一般用法。将 Promise 链嵌套在 catch block 中是一种不好的做法吗?如果是这样,有 promise 和没有 promise 的替代方式是什么?
回答任何问题都会有所帮助。提前致谢。
最佳答案
JavaScript ES7 引入 async/await如果您不熟悉它,它可以解决您所描述的确切问题。它本质上是围绕您已有的语法糖,但它看起来肯定比执行 .then
并将它们链接在一起更好。
关于javascript - 链接 promise 创建 ec2 实例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57643417/