使用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错误。
所以success
和error
已被弃用。
如何在then
声明中解决承诺?
问候。
答案 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;
}
}
});