在'然后'中解决承诺声明

时间:2016-01-05 19:36:41

标签: angularjs promise angular-promise

使用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遗留承诺方法成功与错误   弃用。请改用标准方法。如果   $ httpProvider.useLegacyPromiseExtensions设置为false然后这些   方法将抛出$ http / legacy错误。

所以successerror已被弃用。

如何在then声明中解决承诺?

问候。

3 个答案:

答案 0 :(得分: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);
            });
        }
    };
});

答案 1 :(得分: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()更加清楚。

答案 2 :(得分: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;
        }
    }
 });