簡體   English   中英

Angular $ resource-如何使用promise?

[英]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 API

在角度的上下文中,資源與REST的上下文中的資源相對應,因此,它將期望您的Web服務的行為類似於RESTful應用程序。 為了進一步說明,我們以您的“朋友”為例...(我將重新設計您的URL以更好地匹配REST API)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM