Вопрос по redux, javascript, reactjs, api, promise – Будет ли внешний .catch () работать для всех цепочек / вложенных обещаний?

0

У меня есть небольшой процесс входа в систему, который основывается на 3 вызовах API, который выглядит следующим образом:

export const authenticationSignIn = (email, password) =>
  (dispatch) => {
    dispatch({ type: AUTHENTICATION_REQUEST });
    apiAccountStatus(email, password)
    .then(({ data }) => {
      const status = data.status;
      if (status === 'ACCOUNT_CREATED') {
        apiSignIn(email, password)
        .then(({ data: sessionData }) => {
          apiIndexAccounts()
          .then(({ data: accountsData }) => {
            dispatch({ type: AUTHENTICATION_SUCCESS });
            window.router.transitionTo('/dashboard/home');
          });
        });
      } else if (status === 'SOMETHING ELSE') {
        // TODO: HANDLE SOMETHING ELSE
      }
    })
    .catch(({ response }) => {
      dispatch({ type: AUTHENTICATION_FAILURE });
      dispatch(notificationShow('ERROR', response.data.type));
    });
  };

Как вы можете видеть, эта функция довольно многословна, но каждый вложенный вызов API основан на данных, возвращаемых предыдущим, и я пытаюсь максимально очистить ее (биты диспетчеризации зависят от избыточности, но они, по сути, запускают все, что передается). В конце вы увидитеcatch Скажите, мой вопрос, будет ли это заявление улова работать для всех обещаний или толькоapiAccountStatus?

Ваш Ответ

1   ответ
2

сработает ли это выражение catch для всех обещаний?

Нет, это работает только для внешнего обещания, которое вернулоthen вызов. Это должно быть отклонено дляcatch обратный вызов должен быть активирован. Чтобы это обещание было отклонено, либоapiAccountStatus(…) должен отклонить илиthen обратный вызов должен вызвать исключение иливернуть обещание, которое будет отклонено.

Это последнее, что вы упустили - вы создавали больше обещаний внутри этогоthen обратный звонок, но вы не былиreturnи они не будут цепляться. Ты должен сделать

export function authenticationSignIn(email, password) {
  return (dispatch) => {
    dispatch({ type: AUTHENTICATION_REQUEST });
    apiAccountStatus(email, password)
    .then(({data: {status}}) => {
      if (status === 'ACCOUNT_CREATED') {
        return apiSignIn(email, password)
//      ^^^^^^
        .then(({ data: sessionData }) => {
          return apiIndexAccounts()
//        ^^^^^^
          .then(({ data: accountsData }) => {
            dispatch({ type: AUTHENTICATION_SUCCESS });
            window.router.transitionTo('/dashboard/home');
          });
        });
      } else if (status === 'SOMETHING ELSE') {
        // TODO: HANDLE SOMETHING ELSE
      }
    })
    .catch(({ response }) => {
      dispatch({ type: AUTHENTICATION_FAILURE });
      dispatch(notificationShow('ERROR', response.data.type));
    });
  };
}

Похожие вопросы