$ resource成功回调返回$ promise

时间:2014-05-12 00:06:20

标签: angularjs promise angular-resource

使用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而不是对象?

1 个答案:

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