簡體   English   中英

在“然后”聲明中解決承諾

[英]Resolving a promise in a 'then' statement

使用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舊式的Promise方法成功和錯誤已被棄用。 請改用標准然后方法。 如果$ httpProvider.useLegacyPromiseExtensions設置為false,則這些方法將引發$ http / legacy錯誤。

因此,不贊成successerror

我如何在then語句中兌現承諾?

問候。

您的代碼可以重寫為:

.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);
            });
        }
    };
});

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

...

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

但是嚴格來說, then()返回一個promise。 您正在做的是等待其解決,然后使用該解決方案來解決另一個具有相同數據的承諾。 您無需打擾; 只需返回$http鏈。 誠然,在$ http$ q的文檔中,它們可能對then()更為清晰。

 .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; } } }); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM