2016-08-29 4 views
1

У меня есть следующий код с некоторыми прикованными обещаниями. Я пытаюсь бросить ошибку во внутреннем then, что я ожидал, чтобы быть пойманным внешним catch, но это не текущее поведение:Обещания - захват внутреннего броска

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); 

Как я могу сделать внешний улов быть мишенью throw заявления ?

EDIT Обновленный код, предложенный Vohuman.

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); 

Как я могу сейчас разрешить пользователю в первом еще заявление без его поймали в следующем then?

Идея состоит в том, чтобы отправить подтверждение по электронной почте, если адрес электронной почты не существует в базе данных ИЛИ если адрес электронной почты совпадает с запросом учетной записи (повторно отправить подтверждение по электронной почте). Если письмо уже существует, я хотел бы прекратить выполнение.

+8

Вы должны «вернуть» обещание 'getByEmail'. – undefined

+0

@ Vohuman: Благодарю вас за помощь. И как я должен иметь дело с инструкцией else, которая возвращает действительный ответ? Если вам нужна дополнительная информация, я могу работать на скрипке. –

+0

. Вот скрипка js: https://jsfiddle.net/q5df3qmg/ –

ответ

2

Ваш подход полностью прекрасен, вы только забыли один маленький return. Без этого внутреннее обещание не ожидается, и отклонения не вызовут внешний catch.

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

Спасибо, это имеет смысл! –

Смежные вопросы