2016-08-29 3 views
1

Ich habe den folgenden Code, mit einigen verketteten Versprechen. Ich versuche, einen Fehler in einem inneren then zu werfen, die ich durch die äußere catch gefangen werden erwartet, aber es ist nicht das aktuelle Verhalten:Versprechen - Fang inneren Wurf

User.getById(userId).then((user: any) => { 
    if (user.email != email) { 
     User.getByEmail(email).then((user: any) => { 
       throw new OperationError("exists")); 
     }).catch(StorageError, (err: any) => { 
      user.email = email; 
      return user.save(); 
     }); 
    } else { 
     return user.save(); 
    } 
}).then((user: any) => { 
    return { 
     ok: true, 
     user: user 
    }; 
}).catch(OperationError, (error: any) => { 
    return { 
     ok: false, 
     message: error.message 
    }; 
}).asCallback(reply); 

Wie kann ich die äußere Fang durch die throw Aussage werden gezielt machen ?

BEARBEITEN Aktualisierter Code wie Vohuman vorgeschlagen.

User.getById(userId).then((user: any) => { 
    finalUser = user; 

    if (user.email != email) { 
     return User.getByEmail(email); 
    } 
    else { 
    //I would like for this response [1] to be used in [2] 
     return Promise.resolve(user); 
    } 
}).then((user: any) => { 
    throw new OperationError("Email already exists"); 
}).catch(StorageError, (error: any) => { 

    finalUser.email = email; 
    return finalUser.save(); 
}).then((user: any) => { 
    //[2] here is where I would like the else statement to come 

    sendEmail(user.email, subject, content); 
    return { ok: true, user: user }; 
}).catch(OperationError, (error: any) => { 

    return { ok: false, message: error.message }; 
}).asCallback(reply); 

Wie kann ich den Benutzer in der ersten else-Anweisung löse jetzt, ohne es in dem folgenden then gefangen zu haben?

Die Idee besteht darin, eine E-Mail-Bestätigung zu senden, wenn die E-Mail nicht in der Datenbank vorhanden ist ODER wenn die E-Mail mit dem anfordernden Konto übereinstimmt (E-Mail-Bestätigung erneut senden). Wenn die E-Mail bereits existiert, möchte ich die Ausführung abbrechen.

+8

Sie sollten das Versprechen "getByEmail" zurückgeben. – undefined

+0

@Vohuman: Danke für Ihre Hilfe. Und wie sollte ich mit der else-Anweisung umgehen, die eine gültige Antwort zurückgibt? Wenn Sie mehr Informationen benötigen, kann ich an einer Geige arbeiten –

+0

Hier ist eine js Geige: https://jsfiddle.net/q5df3qmg/ –

Antwort

2

Ihr Ansatz ist völlig in Ordnung, Sie haben nur ein wenig vergessen return. Ohne es wird das innere Versprechen nicht erwartet und Ablehnungen werden das äußere catch nicht auslösen.

User.getById(userId).then((user: any) => { 
    if (user.email != email) { 
     return User.getByEmail(email).then((user: any) => { 
//  ^^^^^^ 
      throw new OperationError("exists")); 
     }).catch(StorageError, (err: any) => { 
      user.email = email; 
      return user.save(); 
     }); 
    } else { 
     return user.save(); 
    } 
}).then((user: any) => { 
    return { 
     ok: true, 
     user: user 
    }; 
}).catch(OperationError, (error: any) => { 
    return { 
     ok: false, 
     message: error.message 
    }; 
}).asCallback(reply); 
+0

Danke, das macht Sinn! –