如何在Promise中处理分支?

时间:2018-07-26 13:58:25

标签: javascript asynchronous promise

我正在使用AWS Cognito实施无密码身份验证流程。与UI相关的逻辑,因此我倾向于选择不仅通过使用Promise(不使用asyncawait来阻止线程)。像下面这样做仍然让我感到,我正在编写回调地狱的另一个“承诺版本”。

  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。我很难找出一种使用纯thenablePromise来实现此目的的方法。使用then s非常简单。

enter image description here

callback

理想情况下,我想在没有其他库的情况下完成此操作。

1 个答案:

答案 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  
};

您的代码看起来“怪异”的原因是因为您正在使用异常进行流控制-没有会话,无法使用已接收的电子邮件进行注册等都是合理且非特殊的情况,因此您应考虑不使用他们的例外。