使用Angular 1.2.14,$ resource的成功回调应该返回一个对象,但它有时会获得$ promise。节点/表达式Web服务返回null,但Angular将其解释为$ promise。当从Web服务返回非null时,成功回调将按预期获取对象。
$resource('/api/users/:userId/team').get({ userId: userId }, function(team) {
console.log('team: ', team);
}, function(err) {
console.log('err: ', err);
});
team的值(成功回调的参数)是:
$promise: Object
catch: function (callback) {
finally: function (callback) {
then: function (callback, errback, progressback) {
__proto__: Object
$resolved: true
__proto__: Resource
$delete: function (params, success, error) {
$get: function (params, success, error) {
$query: function (params, success, error) {
$remove: function (params, success, error) {
$save: function (params, success, error) {
constructor: function Resource(value) {
__proto__: Object
为什么成功回调获得$ promise而不是对象?
答案 0 :(得分:4)
为什么成功回调获得$ promise而不是对象?
因为它发出了成功的HTTP请求并收到了恰好是null
的响应。返回null
并不是我们向HTTP服务器发出信号,告知我们的值无效 - 相反,我们会返回相应的状态代码来指示失败 - 请参阅this article。
如何从客户端修复它?
嗯,你没有问这个问题,但我认为这是你真正关心的事情,因为$resource
会返回一个承诺,你可以自己转换它,例如通过装饰器。
如果您不需要重复使用,您可以这样做:
$resource('/api/users/:userId/team').get({ userId: userId }).then(function(res){
if(res === null) return $q.reject("Error, server returned null");
return res;
}).then(function(team) {
console.log('team: ', team);
}, function(err) {
console.log('err: ', err);
});
否则,您可以用更通用的方法包装它:
function notNull(prom){
return prom.then(function(res){
if(res === null) return $q.reject("Error, got null);
return res;
});
};
可以让你这样做:
notNull($resource('/api/users/:userId/team').get({ userId: userId })).then(function(res){
// server returned not null.
}).catch(function(e){
// returned null, or other server error, or error in previous then handler.
});