С 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
заявлении?
С уважением.
Ваш код можно переписать как:
.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;
}
}
});
Просто передайте две функции для 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.