如何有条件地设置解构

时间:2017-06-09 18:03:42

标签: javascript asynchronous ecmascript-6

我不确定这篇文章的最佳标题,您可以根据自己的意愿重新编辑它。

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

在接收方,如何管理这两种方案?例如,我试图弄清楚如何捕获它保释的情况(我从deletePRBucket的调用中得到null:

来电 - 我的测试

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/`)
})

因此,我在此处收到错误,errorstdoutstderr值不存在,因为如果我的删除方法没有返回null,则返回null尝试删除(因为存储桶不存在)。所以不确定如何处理它决定保释并返回null而不是返回promise的情况。

更新(还包括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`)
}

我的意思是我想我可以返回一个对象{error,stdout,stderr}并检查stdout是否为null或类似的东西,可能会返回一个承诺? if(!bucketExists) return new Promise(() => { error, stdout, stderr })

2 个答案:

答案 0 :(得分: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");
}

答案 1 :(得分:0)

如果promise返回null,则提供要使用的默认对象。

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