【问题标题】:Resolving a promise in a 'then' statement解决“then”语句中的承诺
【发布时间】:2023-03-15 14:34:02
【问题描述】:

使用 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 方法成功和错误已经 已弃用。请改用标准 then 方法。如果 $httpProvider.useLegacyPromiseExtensions 设置为 false 然后这些 方法会抛出 $http/legacy 错误。

所以successerror 被弃用了。

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

问候。

【问题讨论】:

    标签: angularjs promise angular-promise


    【解决方案1】:

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

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

    不过,严格来说,then() 返回一个承诺。您正在做的是等待它解决,然后使用该解决来解决具有相同数据的 another 承诺。你不需要打扰;只需返回$http 链。诚然,他们可能会在 $http$q 的文档中对 then() 更清楚一些。

    【讨论】:

    • 你能分享一些关于解决'then'块中的承诺的代码吗?
    【解决方案2】:

    你的代码可以改写为:

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2018-07-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-13
        • 2016-02-28
        • 2019-12-06
        • 1970-01-01
        • 2015-06-24
        相关资源
        最近更新 更多