2016-08-02 96 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

是啊,這可能會更好。出於某種原因,我更舒適的嵌套,但我認爲大多數人會推薦鏈接。 –