2017-06-09 124 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

相關問題