Функциональное программирование с вложенными обещаниями

0

В проекте Angular я работаю над системой бронирования с множеством различных сценариев. Основываясь на ответе на обещание, он должен попытаться сделать другой звонок на сервер. Это приводит к своего рода обратному обращению - ад, о котором я думал, что обещания могут помешать мне: функции не возвращают ничего, кроме инициирования другой функции.

Вот упрощенное дерево решений:

    1. Сделать заказ

      • 1.1 (succes) - Получить информацию о бронировании

        • 1.1.1 (успех) - Показать данные для бронирования пользователю
        • 1.1.2 (fail) - Показать кнопку повтора
      • 1.2 (сбой) - Проверить код ошибки

        • 1.2.1 if (errorCode === 'offout')
          • 1.2.1.1 - Попробуйте альтернативное бронирование
          • 1.2.1.1.1 (succes) Сведения о бронировании груза
          • 1.2.1.1.1.1 (succces) CheckPriceDifference()
          • 1.2.1.1.1.2 (fail) Показать soldOutMessage();
      • 1.2.2 if (errorCode! = 'Soldout') * Показать кнопку повтора.

Мой код выглядит примерно так:

makeBooking()
.then(function(response){
     succesHandler(response);
}, function(error){
    errorHandler(response);
})

succesHandler(response){
    loadDetails(response)
      .then(function(details){
          showDetails(details);
    }, function(error){
          handleDetailsError(error);
    }
 }

 errorHandler(response){
     if ( checkSoldout(reponse) ){
          makeAlternativeBooking();
     }
 }

Является ли это хорошим (функциональным) способом работы с этими "вложенными" обещаниями?

  • 0
    Я бы не стал винить это в обещаниях, ваша логика немного запутана
  • 0
    Всегда возвращайтесь из обработчика Promise. В makeBooking() обещание, полученное от makeBooking() , не будет ждать, пока результат, полученный от successHandler или errorHandler, сам себя разрешит / отклонит.
Теги:
functional-programming
promise

1 ответ

1
Лучший ответ

ваш поток расходится в каждой точке, незначительные изменения могут быть внесены в ваш код, за исключением того, что его можно немного сократить:

makeBooking().then(succesHandler, errorHandler)

succesHandler(response){
    loadDetails(response)
      .then(showDetails, handleDetailsError)
 }

 errorHandler(response){
     if ( checkSoldout(reponse) ){
          makeAlternativeBooking();
     }
 }

Ещё вопросы

Сообщество Overcoder
Наверх
Меню