2014-11-21 49 views
1

我正在使用Angular 1.3中的$ resource。可以在新的角度资源上伪造一个承诺吗?

我有一堆控制器与资源对象一起工作的方法。

当检索状态很重要时,这些方法使用资源的$ promise属性来确保它们仅在检索后处理对象。这些与现有的和更新的资源对象都可以正常工作。

var ProposalResource = $resource(proposalUrl, {id: '@id'}, {'update': {method: 'PUT'}});

资源对象由ProposalResource.get({id:...获得。

但是,当我使用new ProposalResource(...创建新资源对象以创建新对象时,这些方法失败,因为$ promise属性未定义。

我已经通过将新资源对象上的$ promise属性设置为已解决的承诺来解决此问题。

这似乎工作确定,但它感觉像一个讨厌的kludge。显式检查是否在所有其他方法中定义了$ promise属性的选项更具吸引力。

我做对了吗?

+0

您应该提供更多关于您实际正在做什么的细节。 '$ resource'创建一个资源“类”,然后可以用它来创建资源实例。那些实例从一开始就有'promise'属性,所以你的问题不会存在。也许你正在将'$ resource'包装进某些东西,这可以解释'新的ProposalResource()'。 – zeroflagL 2014-11-21 09:42:30

+0

我已经进一步澄清。 $ promise属性仅在获取现有对象时才存在,我的问题是我需要将新对象与现有对象保持一致 - 根据用户对它的操作,可能不需要保存新对象。 – 2014-11-22 01:52:28

+0

我明白。那么使用@TomMcGeehon提出的'q.when()'方法似乎是一个合理的解决方案。另一个可能是装饰'$ resource',以便所有资源都具有'$ promise'属性。这是你所做的一切,但只有一次;) – zeroflagL 2014-11-22 15:08:39

回答

0

我不知道为什么你需要使用ProposalResource,但我通常使用$ q提供程序。

这样你可以做一个简单的函数返回一个承诺,你可以从你的控制器方法调用它。使用一个承诺

示例服务:

function someServiceMethod(params) { 
    //do something here, maybe create an object,maybe make a call with $http or something 
    var obj = createSomeObject(params); 
    //this resolves the object once the createSomeObject method or function have completed 
    $q.when(obj); 
} 

这种做法比做整个简单:var deferred = $q.defer();和deferred.resolves后deferred.promise返回。

如果您使用的是$ resource,那么我建议您只使用角度的$ http提供程序。

这里的$http 这里的$q

+0

我不认为在这种情况下什么时候适合,除非你有时从'createSomeObject'返回承诺,有时不会。 $资源节省了我很多$ http重复,所以我想继续使用它。 – 2014-11-21 01:59:16

+0

我不知道为什么你需要创建一个新的$资源对象。你能举一个你如何做这个的例子吗? – TommyMac 2014-11-21 05:29:51

+0

我已经进一步澄清了我的问题。我使用新的,因为我正在做一个新的对象,我有时后来$ save()。 – 2014-11-22 01:53:28

0

正如$resource AngularJS Doucmentation提到:

集体诉讼返回空实例(具有附加属性下面 )。 实例操作返回操作的承诺。

上面的语句给你一个暗示,例如行动方法,$得到,$保存,...和您在$resource动作定义定义任何其他操作,将始终返回一个承诺。

DEMO

例如

var User = $resource('user.json', {}, { 
    'update': {'method': 'PUT'} 
}); 

var user = new User(); 

// this sends a GET request to user.json and returns the promise directly 
// from the instance action. 
user.$get() 
    .then(function(latestUserData) { 
    // latestUserData is also an instance of the User resource 
    return latestUserData.$update({ 
     'name': 'Ryan' 
    }); 
    }) 
    .then(function(updatedUserData) { 
    // do whatever you want here 
    }); 

正如你所看到的,比如动作$get返回一个承诺,当这种希望解决,.then()回调返回从服务器,并在它被包裹在同一时间响应数据/与用户$resource实例。

+0

谢谢ryeballar,这一切都是我所熟知的。我不明白它是如何回答或解决我的问题。 – 2014-11-23 22:25:22