2016-08-02 3 views
2

У меня есть следующие функции Javascript:Как упростить это с обещаниями

function render(id) { 

      var deferred = $q.defer(); 

      Flights.get(id).then(function(flightDto){ 

       Arrivals.getDemoProfile(flightDto.id).then(function(arrivalDto) { 

       self.arivalId = arrivalDto.id; 
       deferred.resolve(self); 

       }); 

      }); 

      return deferred.promise; 

} 

Есть ли способ, что я могу упростить лучше, используя обещание так, что обещание решает только после того, как вызов заезды сделано? Я использую угловую и встроенную библиотеку $ q.

ответ

4
function render(id) { 
    return Flights.get(id).then(function(flightDto) { 
     return Arrivals.getDemoProfile(flightDto.id).then(function(arrivalDto) { 
      self.arivalId = arrivalDto.id; 
      return self; 
     }); 
    }); 
} 

return Все, что вы внутри then будет рассматриваться как решимость этого обещания.
Если вы не вернете обещание, в этом случае это будет ожидаться, и результат будет рассматриваться как решение этого обещания.

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

1

Великая вещь в обещаниях в том, что они могут быть прикованным вместо того, чтобы быть вложенным. Это делает код намного понятнее и легче рассуждать (о чем идет речь, например, в первую очередь). Ниже приведен код из ответа Буха Буха, улучшенный, чтобы связать второе обещание вместо гнездования:

function render(id) { 
    return Flights.get(id) 
     .then(function(flightDto) { 
      return Arrivals.getDemoProfile(flightDto.id); 
     }) 
     .then(function(arrivalDto) { 
      self.arivalId = arrivalDto.id; 
      return self; // I AM NOT SURE ABOUT THE USEFULNESS OF THIS LINE... 
     }) 
    ; 
} 
+0

Да, это, вероятно, лучше. По какой-то причине мне удобнее гнездовать, но я думаю, что большинство людей порекомендует цепочку. –

Смежные вопросы