我正在使用AWS Cognito实施无密码身份验证流程。与UI相关的逻辑,因此我倾向于选择不仅通过使用Promise
(不使用async
和await
来阻止线程)。像下面这样做仍然让我感到,我正在编写回调地狱的另一个“承诺版本”。
const session = await getSession();
if (!session) {
try {
const user = await signUp(emailAddress);
} catch (error) {
try {
const state = await resendConfirmationCode();
} catch {
await forgotPassword();
}
}
}
我知道,我知道可以使用then
将所有功能链接在一起,但是随后的then
中的响应实际上取决于最后一个{{ 1}}就是为什么我问如何处理Promise(或then
)中的分支的原因。
所有方法都返回then
。我很难找出一种使用纯thenable
和Promise
来实现此目的的方法。使用then
s非常简单。
callback
理想情况下,我想在没有其他库的情况下完成此操作。
答案 0 :(得分:1)
由于您已经在使用Promise和现代的Node-绝对没有理由不使用async/await
,它使您可以同步编写异步代码。
此外,让我们写一个小助手来检查promise流,因为您正在使用异常进行流控制,这通常是一个很大的禁忌之事:
const reflect = p => p.then(value => ({ state: 'fulfilled', value }),
error => ({ state: 'rejected', error }));
现在,让我们重写它,而不对非异常流控制使用异常:
export const doInitAuth = async emailAddress => {
if ((await reflect(getSession()).state === 'fulfilled') return; // already has a live session
if ((await reflect(signUp(emailAddress))).state === 'fulfilled') return; // signed up successfully
if ((await reflect(resendConfirmationCode())).state === 'fulfilled') return; // sent confirmation email
if ((await reflect(forgotPassword())).state === 'fulfilled') return;
// deal with what you want to do in case forgotPassword failed here
};
您的代码看起来“怪异”的原因是因为您正在使用异常进行流控制-没有会话,无法使用已接收的电子邮件进行注册等都是合理且非特殊的情况,因此您应考虑不使用他们的例外。