2014-11-21 34 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