在新的角度资源上伪造承诺是否可以?

时间:2014-11-21 00:52:02

标签: angularjs

我在Angular 1.3中使用$ resource。

我有一堆控制器,其中的方法可以处理资源对象。

当检索状态很重要时,这些方法使用资源的$ promise属性来确保它们仅在检索到对象后对其进行处理。这些都适用于现有和更新的资源对象。

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

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

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

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

这似乎工作正常,但感觉就像一个讨厌的kludge。显然检查$ promise属性是否在所有其他方法中定义的选项更不吸引人。

我做对了吗?

2 个答案:

答案 0 :(得分:0)

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

这样你就可以做一个简单的函数来返回一个promise,你可以从你的控制器方法中调用它。

使用承诺的示例服务:

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,那么我建议你只使用来自angular的$ http提供程序。

此处$http 这是$q

答案 1 :(得分:0)

$resource AngularJS Doucmentation

中所述
  

类操作返回空实例(带有其他属性)   下面)。 实例操作会返回操作的承诺。

上述声明为您提供了实例操作方法, $ get,$ save,... 以及您在{{1}中定义的任何其他操作的提示动作定义,将始终返回一个承诺。

<强> DEMO

e.g。

$resource

如您所见,实例操作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 }); 返回一个promise,当该promise被解析时,$get回调从服务器返回响应数据,同时将其包装/实例化用户.then()