解析 '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.
所以 success
和 error
被弃用了。
如何解决 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;
}
}
});
有了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.
所以 success
和 error
被弃用了。
如何解决 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;
}
}
});