2016-08-02 87 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; 

} 

有什么办法,我可以更好地简化使用的承诺,使抵港呼叫后作出承诺,只解决?我正在使用angular和内置的$ 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

是啊,这可能会更好。出于某种原因,我更舒适的嵌套,但我认为大多数人会推荐链接。 –