Разрешение обещания в заявлении «тогда»

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 обещает, что методы успеха и ошибки устарели. Вместо этого используйте стандартный метод. Если для параметра $ httpProvider.useLegacyPromiseExtensions установлено значение false, то эти методы будут вызывать ошибку $ http/legacy.

Таким образом, success и error стали устаревшими.

Как я могу решить обещание в then заявлении?

С уважением.

Теги:
promise
angular-promise

3 ответа

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

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

Просто передайте две функции для then() качестве параметров, первая из которых - для успеха, а вторая - для отказа.

...

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

Строго говоря, then() возвращает обещание. То, что вы делаете, ждет его разрешения, а затем используя это решение для решения другого обещания с теми же данными. Вам не нужно беспокоиться; просто верните цепочку $http. По общему признанию, они могут быть немного яснее о том then() в документации для $ http и $ q.

  • 0
    Не могли бы вы поделиться кодом для разрешения обещания в блоке «тогда»?
  • 0
    Да, один момент.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню