2016-05-17 3 views
0

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

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

    1. бронирование

      • 1.1 (SucceS) Make - Fetch детали бронирование

        • 1.1.1 (успех) - Показать данные бронирования пользователю
        • 1.1.2 (обязательно) - Показать кнопку повтора
      • 1,2 (обязательно) - Проверьте ERRORCODE

        • 1.2.1, если (ERRORCODE === 'полностью преданных')
          • 1.2.1.1 - Попробуйте сделать альтернативные бронирования в
          • детали 1.2.1.1.1 (Сукчес) бронирование Load
          • 1.2.1.1.1.1 (succces) CheckPriceDifference()
          • 1.2.1.1.1.2 (fail) Показывать soldOutMessage();
      • 1.2.2, если (ERRORCODE! = 'Полностью преданных') * Показать кнопку повтора.

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

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

я бы не стал винить в этом обещания, ваша логика просто бит – Paarth

+0

Всегда возвращайтесь из обработчика Promise. Иначе обещание, полученное в результате 'makeBooking()', не будет ждать результата от successHandler или errorHandler для разрешения/отклонения. –

ответ

1

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

makeBooking().then(succesHandler, errorHandler) 

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

errorHandler(response){ 
    if (checkSoldout(reponse)){ 
      makeAlternativeBooking(); 
    } 
} 
Смежные вопросы