2016-01-05 30 views
0

隨着AngularJS,我解決我的諾言直接就像這樣:在服務解決的「然後」聲明中承諾

.factory('movieService', function($http, $log, $q) { 
    return { 
    getMovie: function(movie) { 
    var deferred = $q.defer(); 
    $http.get('/api/v1/movies/' + movie) 
     .success(function(data) { 
      deferred.resolve({ 
      title: data.title, 
      cost: data.price}); 
     }).error(function(msg, code) { 
      deferred.reject(msg); 
      $log.error(msg, code); 
     }); 
    return deferred.promise; 
    } 
    } 
}); 

如文檔(https://docs.angularjs.org/api/ng/service/ $ HTTP#)中指出:

已棄用$ http legacy legacy methods成功和錯誤 。改爲使用標準然後方法。如果 $ httpProvider.useLegacyPromiseExtensions設置爲false,那麼這些 方法將拋出$ http/legacy錯誤。

因此successerror已被棄用。

如何解決then聲明中的承諾?

問候。

回答

1

您的代碼可以被改寫爲:

.factory('movieService', function($http, $log, $q) { 
    return { 
     getMovie: function(movie) { 
      var deferred = $q.defer(); 

      $http.get('/api/v1/movies/' + movie).then(function(response){ 
       var data = response.data; 

       deferred.resolve({ 
        title: data.title, 
        cost: data.price 
       }); 
      }, function(msg, code) { 
       deferred.reject(msg); 
       $log.error(msg, code); 
      }); 

      return deferred.promise; 
     } 
    }; 
}); 

雖然你做更多的工作不是必要的。它可以縮短到:

.factory('movieService', function($http, $log, $q) { 
    return { 
     getMovie: function(movie) { 
      return $http.get('/api/v1/movies/' + movie).then(function(response){ 
       var data = response.data; 

       return { 
        title: data.title, 
        cost: data.price 
       }; 
      }, function(msg, code) { 
       $log.error(msg, code); 
      }); 
     } 
    }; 
}); 
0

只需將兩個函數傳遞給then()作爲參數,第一個是成功,第二個是失敗。

... 

$http.get('/api/v1/movies/' + movie) 
.then(function(result) { 
      //Your success code here 
     }, 
     function(result) { 
      //Your fail code here 
     }); 
... 

嚴格來說,儘管如此,then()返回一個承諾。你正在做的是等待它解決,然後使用該決心解決另一個承諾與相同的數據。你不需要打擾;只需返回$http鏈。無可否認,在$http$q的文檔中,他們可以更清楚一點then()

+0

能否請您分享一下解決的「然後」塊一個承諾一些代碼? – Denter

+0

是的,有一刻。 –

0

.factory('movieService', function ($http, $log, $q) 
 
{ 
 
    return { 
 
     getMovie: function (movie) 
 
     { 
 
      var deferred = $q.defer(); 
 
      
 
      $http.get('/api/v1/movies/' + movie).then(
 
       
 
       //Success as first parameter 
 
       function (data) 
 
       { 
 
        deferred.resolve({ 
 
         title: data.title, 
 
         cost: data.price 
 
        }); 
 
       }, 
 
       
 
       // Error as second parameter 
 
       function (msg, code) 
 
       { 
 
        deferred.reject(msg); 
 
        $log.error(msg, code); 
 
       } 
 
      ); 
 
      
 
      return deferred.promise; 
 
     } 
 
    } 
 
});