javascript - 链接 promise 创建 ec2 实例

标签 javascript node.js amazon-web-services amazon-ec2 promise

我想以 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/

相关文章:

javascript - 如何在javascript中按两个名称对数组进行排序?

amazon-web-services - 有没有办法在 AWS DynamoDB 中选择嵌套字段作为分区键?

java - 如何通过邮件启动 AWS SWF 工作流程?

javascript - 连续循环滚动

Javascript 代码审查 - Make element "toggleable"

javascript - 选择 JS 插件 通过 Node JS 安装插件

javascript - Node.js + socket.io : app on server not working correctly

javascript - Mongoose 中 "SELECT * WHERE city != null"的模拟

linux - 主节点的 Kops 滚动更新失败并显示 "Cluster did not pass validation"

JavaScript 函数每次运行时循环次数是原来的两倍