2017-06-09 14 views
1

Ich war nicht sicher der beste Weg, diesen Beitrag zu titeln, fühlen Sie sich frei, es wie Sie wünschen, umzubenennen.Wie man Destrukturierung bedingt einstellt

Ich habe eine Methode, die, wenn sie beschließt, zu bailen, ich habe es null zurückgeben. Sonst gibt es ein Versprechen zurück.

Auf der Empfängerseite, wie kann ich beide Szenarien verwalten? Zum Beispiel ich versuche, herauszufinden, wie der Fall zu erfassen, wo sie bürgt (I aus dem Aufruf null zurück zu deletePRBucket erhalten:

Caller - Mein Test

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

So bekomme ich einen Fehler Hier, dass die Werte error, stdout und stderr nicht existieren, weil meine Methode delete eine Null zurückgibt, wenn sie nicht versucht zu löschen (weil der Bucket nicht existiert). So nicht sicher, wie der Fall zu behandeln, wo es entscheidet um zu bailen und gibt null zurück, anstatt das Versprechen zurückzugeben

AKTUALISIERT (gehörte auch die bucketExists Implementierung):

Implementierung

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

ich meine ich nehme an, ich nur ein Objekt {Fehler, stdout, stderr} zurückkehren konnte und prüfen, ob stdout ist null oder etwas ähnliches, vielleicht ein Versprechen abgeben? if(!bucketExists) return new Promise(() => { error, stdout, stderr })

+1

Warum nicht immer ein Versprechen zurückgeben und es auflösen oder ablehnen, abhängig davon, ob die Funktion ausläuft oder nicht? – AtheistP3ace

+1

Ich ging mit der Rückkehr ein Versprechen, das löst {Fehler, stdout, stderr} – PositiveGuy

+2

Cool. Viel Glück! – AtheistP3ace

Antwort

0

Ich denke, dies eine Frage der Fehlerbehandlung ist:

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

gut ich will keine Fehler werfen, würde ich es log log. Der Anrufer sollte leicht überprüfen können, ob er erstellt wurde oder nicht. Wenn das Löschen fehlschlägt, wird es protokolliert – PositiveGuy

+0

@positiveguy das ist, was es tut. Geworfene Fehler können eingefangen werden ... –

+0

im Kopf behalten exec() ist bereits promiziiert – PositiveGuy

0

ein Standard-Objekt bereitstellen verwendet werden, wenn das Versprechen null zurückgibt.

+0

das würde erfordern, dass der Anruf VOR dem {} gemacht wird. Wenn der Bucket überhaupt nicht existiert, möchte ich nicht einmal deletePRBucket aufrufen ... weshalb ich die erste Überprüfung auf Existenz des Buckets habe. Vielleicht verstehe ich deinen Code falsch? – PositiveGuy

+0

fyi siehe aktualisierten Beitrag, habe ich ein bisschen mehr Informationen – PositiveGuy

+0

Die Überprüfung für den Eimer ist in 'deletePRBucket', warum müssen Sie auch überprüfen, ob es existiert, bevor Sie anrufen? – Barmar