2017-06-09 58 views
1

我不确定最好的方式来标题这篇文章,随意按照你的意愿重新标记。如何有条件地设置解构

我有一个方法,如果它决定保释,我让它返回null。否则它会返回一个承诺。

在接收端,我如何管理这两种情况?比如我想弄清楚如何在那里捞出捕捉的情况下(我从呼叫deletePRBucket空回:

来电 - 我的测试

it('can create a new S3 branch', async() => { 
    const options = { branch: '11' } 
    // first lets check if we delete it if it already exists before trying to re-create it 
    let { error, stdout, stderr } = await Deploy.deletePRBucket(options.branch) 

    ({ error, stdout, stderr } = await Deploy.createPRBucket(options)), 
      result = JSON.parse(stdout) 

      expect(result.Location).to.equal(`http://oursite-${options.branch}.s3.amazonaws.com/`) 
}) 

所以我得到一个错误这里的值error,stdoutstderr不存在,因为如果我的delete方法没有尝试删除(因为存储桶不存在),我的delete方法返回null。所以不知道如何处理它决定的情况保释并返回空值而不是退还承诺。

修订(也包括bucketExists实现):

实施

export async function bucketExists(bucketName){ 
    console.log(`attempting to find bucket oursite-${bucketName}`) 
    let exists = null 
    try { 
    let { error, stdout, stderr } = await exec(`aws s3api head-bucket --bucket oursite-${bucketName}`) 
    exists = stdout === "" 
    } 
    catch(err){ 
    exists = false 
    } 

    return exists 
} 

export async function deletePRBucket(branch){ 
    const bucketExists = await this.bucketExists(branch) 
    if(!bucketExists) { 
    return new Promise((resolve) => { 
     resolve({ error, stdout, stderr }) 
    }) 
    } 

    return exec(`aws s3 rb s3://oursite-${branch} --force`) 
} 

我的意思是,我想我可以只返回一个对象{错误,标准输出,标准错误}和检查标准输出为空或类似的东西,也许会返回一个承诺? if(!bucketExists) return new Promise(() => { error, stdout, stderr })

+1

为什么不总是返回一个承诺,并决定或拒绝它取决于函数是否退出? – AtheistP3ace

+1

我与退回承诺,解决{错误,stdout,stderr} – PositiveGuy

+2

酷。祝你好运! – AtheistP3ace

回答

0

我认为这是错误处理的一个问题:

export async function deletePRBucket(branch){ 
    const bucketExists = await this.bucketExists(branch) 
    if(!bucketExists) throw new Error("bucket"); 

    return exec(`aws s3 rb s3://oursite-${branch} --force`) 
} 

... 

try{ 
let { error, stdout, stderr } = await Deploy.deletePRBucket(options.branch); 
}catch(e){ 
    console.log("error"); 
} 
+0

以及我不想抛出错误,我会控制台登录它。调用者应该能够容易地检查它是否被创建。如果删除失败,那么它将被记录 – PositiveGuy

+0

@positiveguy那就是它的功能。抛出的错误可以被捕获... –

+0

请记住exec()已经promisified – PositiveGuy

0

提供一个默认的对象被使用,如果承诺返回null

let { error, stdout, stderr } = (await Deploy.deletePRBucket(options.branch)) || {}; 
+0

这将需要在{}之前进行呼叫。如果存储桶不存在,我甚至不想调用deletePRBucket ...这就是为什么我首先检查存储桶的存在。也许我误解你的代码? – PositiveGuy

+0

fyi查看更新后的帖子,我收录了更多信息 – PositiveGuy

+0

桶的检查在'deletePRBucket'里面,为什么你在调用之前还需要检查它是否存在? – Barmar

相关问题