[英]Angular $resource - How can I use promise?
如何在$ resource中使用promise?
這是我的服務
app.service("friendService",function( $resource, $q ) {
// Return public API.
return({
addFriend: addFriend,
updateFriend: updateFriend,
getFriends: getFriends,
removeFriend: removeFriend
});
function updateFriend( friend ) {
var postData = {
id: friend.id,
name: friend.name
};
var request = $resource("api/update.php", null,{
update: {
method:'PUT',
data:postData
}
});
return( request.$promise.then( handleSuccess, handleError ) );
}
我得到這個錯誤,
TypeError:request。$ promise未定義
用$ resource正確的方法是什么?
從
return( request.$promise.then( handleSuccess, handleError ) );
至
return request.update().$promise.then(handleSuccess, handleError);
就是說,像這樣使用$resource
效率很低,卻沒有利用它。 最好用$http
代替。
您應該將服務簡化為實際上是$ resource
app.factory('friendService', [ '$resource', function($resource) {
return $resource('/api/friends/:id', null, {
'update' : {
method : 'PUT'
}
});
} ]);
這將自動提供以下端點(實際上,這是$ resource的優點):
{ 'get': {method:'GET'},
'save': {method:'POST'},
'query': {method:'GET', isArray:true},
'remove': {method:'DELETE'},
'delete': {method:'DELETE'}
};
以下是一些用法示例:
friendService.query(success, error); // GET /friends
friendService.get({ id : "exampleId" }, success, error); // GET /friends/exampleId
friendService.save({/* no params */}, friendObjectWithId, success, error); // POST /friends/idTakenFromObject
friendService.delete({ id : "exampleId" }, {}, success, error); // DELETE /friends/exampleId
friendService.update({/* no params */}, friendObjectWithId, success, error); // PUT /friends/idTakenFromObject
因此,正如文檔的這一行所描述的,您不需要$ promise來指定回調:
非GET“類”操作:Resource.action([參數],postData,[成功],[錯誤])
因此,您可以簡單地執行以下操作:
friendService.update({}, friendObject, successHandler, errorHandler)
我認為您誤解了$resource
是什么,因為您試圖像使用$http
一樣使用它。
$resource
是$http
周圍的“包裝器”,提供了一種與RESTful api交互的面向對象CRUD方式。 ( DOCS對其進行了很好的解釋並提供了很好的示例 )
從您的URL,我認為您實際上並沒有使用REST api,因此使用$http
服務而不是$ resource服務可能會更好。
不管怎樣,這是一個有用的小提琴 。
在角度的上下文中,資源與REST的上下文中的資源相對應,因此,它將期望您的Web服務的行為類似於RESTful應用程序。 為了進一步說明,我們以您的“朋友”為例...(我將重新設計您的URL以更好地匹配REST API)
采用以下符合REST + CRUD的方案(用於Friend資源)
Resource URI Methods allowed
Friend Collection api/friend GET, POST
Friend api/friend/:id GET, PUT
這里的基本思想是, 每個資源都由URI唯一表示 (這實際上是URI的定義:->統一資源標識符), HTTP方法(Verb)用於定義將在該資源上執行的操作。
當然,REST不僅限於此,我建議您閱讀這篇SO POST或這篇有趣的文章 ,甚至是Roy Fielding的論文 (與REST一起產生的家伙),它對概念的解釋比我所希望的要好得多。
這個問題容易引起激烈的爭論,您可以在本SO Post上閱讀一些有趣的觀點,以及Roy Fielding的一篇文章也部分解決了這一問題 。 綜上所述,REST不需要干凈的URL。 實際上,它不需要任何類型的語義邏輯URL結構。
REST API必須是超文本驅動的,也就是說,給定一個入口點(URL),API必須具有自解釋性,以便客戶端可以通過媒體類型給定的資源類型自己“發現”資源和關系。 。 這意味着,如果URL更改,則API不會中斷!
因此,實際上,這可能是有效的:
Home /
Friend Collection /foo
Friend Resource 1 /bar
Friend Resource 2 /baz
以及這可能是有效的:
Home index.php
Friend Collection index.php?q=api/friend
Friend Resource 1 index.php?q=api/friend/1
Friend Resource 2 index.php?q=api/friend/2
或者是堂兄,使用mod_reqrite制作“干凈的URL”可能是有效的
Home /
Friend Collection /api/friend
Friend Resource 1 /api/friend/1
Friend Resource 2 /api/friend/1
甚至這可能是有效的...
Home /index.php
Friend Collection /friend.php
Friend Resource 1 /friend_1.php
Friend Resource 2 /friend_2.php
服務器絕沒有義務遵循任何模式。 但是,這並不意味着您不應該遵循某個結構,而必須主要出於SEO目的(或人類可讀性)。 並且,在最后一個示例中,可能難以開發依賴於每個單獨資源的單獨腳本的合理的Web服務。 (您可能不會違反REST原則,但是可能會違反一些基本的編程規則,例如DRY ...)
另外,對角度資源的看法與URL結構有關。 這不是絕對要求,但...
關於您的特定問題,是的,您需要mod_rewrite來匹配我給您的示例。 但是您不需要mod_rewrite即可創建REST兼容的API。
現在我們的API方案已經設置並遵循REST + CRUD原則,我們可以充分利用angular-resource模塊的潛力。
我們可以創建“朋友”的客戶端表示(接口)。
//Custom actions
var actions = {
update: {
method: 'PUT'
}
}
var friendUrl = "/api/friend/:id"; // should be obtained by inspecting the API iteself, usually the parent collection.
var Friend = $resource(friendUrl, {id: '@id'}, actions);
要結交朋友,我們將發出GET請求(並指定其ID);
Friend.get({id: 1}).$promise.then(
function (response) {
//console.log(response);
}
);
DELETE和PUT請求(我們創建並稱為update)基本上是同一回事。 $ resource還支持使用對象的方法查詢來檢索集合。 您可以使用它來檢索朋友的集合。
請注意,為簡單起見,我使用的是硬編碼網址
請求只是設置您的端點。 您實際上需要在其上調用一些方法,例如request.get({id: 1}).$promise;
或request.query({term: 'test'}).$promise;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.