解析 'then' 语句中的承诺

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#) :

The $http legacy promise methods success and error have been deprecated. Use the standard then method instead. If $httpProvider.useLegacyPromiseExtensions is set to false then these methods will throw $http/legacy error.

所以 successerror 被弃用了。

如何解决 then 语句中的承诺?

此致。

只需将两个函数作为参数传递给then(),第一个是成功的,第二个是失败的。

...

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

不过,严格来说,then()return是一个承诺。您正在做的是等待它解析,然后使用该解析来解析具有相同数据的 另一个 承诺。你不需要打扰;只是 return $http 链。诚然,他们可以在 $http and $q.

的文档中更清楚地了解 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);
            });
        }
    };
});

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