2015-01-31 168 views
0

我使用$資源,但只需輕鬆使用$ HTTP(這曾經可以使這項工作對我來說)...如何從角度服務中獲得承諾的價值?

我想服務/工廠稱爲User,並希望喜歡與它互動所以:

var user = new User() 

user.name() // 'Joe User' 

但無論我如何努力,我只能從我的服務對象中的承諾,必須使用.then方法來解決的承諾。

我不能從User服務中解析它,只是發送來自各種方法調用的值,如.name.email等?

如果是這樣,怎麼樣?

這裏是(使用的CoffeeScript)

'use strict' 

class User 
    constructor: ($resource) -> 
    @$resource = $resource '/api/v1/users/:id' 

    current: -> 
    @$resource.get(id: 'current').$promise 

    name: -> 
    # I'd like to call current() here and just get the data.name out of it. 


angular.module('myApp').service 'User', ['$resource', User] 

這裏,我已經修改,以進一步說明我很困惑的例子我的服務對象有關:

'use strict' 

class User 
    constructor: ($resource) -> 
    @$resource = $resource '/api/v1/users/:id' 

    current: -> 
    @user = @$resource.get(id: 'current') 
    return @user 


angular.module('myApp').service 'User', ['$resource', User] 

如果我撥打User.current()我得到:

Resource {$promise: Promise, $resolved: false, toJSON: function, $get: function, $save: function…} 
    > $promise: Promise 
    > $resolved: true 
    > user: Object 
    > id: 1 
    > first_name: "Joe" 
    > last_name: "User" 
    > __proto__: Resource 

所以在我的腦海裏,我應該能夠調用User.current().user但是當我做,我得到undefined

+0

請發佈您的服務代碼 – 2015-01-31 21:43:17

+0

您可能可以使用transformResponse選項。 https://docs.angularjs.org/api/ngResource/service/$resource – 2015-01-31 21:44:31

+0

我正在使用咖啡腳本,但會編輯我的帖子以顯示它。 – Nathan 2015-01-31 21:44:55

回答

1

但無論我如何努力,我只能從我的服務對象得到了承諾,必須使用然後解決承諾的方法。

這就是承諾的工作原理。

由於Angular中的服務是單例,所以好處是您不必重複此操作。壞事是你必須在某個時候做一次。

從技術上講,你可以在app init上執行它,運行抓取並將其存儲到服務變量中。然後你只需要從控制器讀取這個變量。

所以,你在正確的軌道上,只要確保在應用程序加載時以及用戶交互開始之前初始化該服務即可。


如果你在一個開箱即用解決方案的時候,考慮的的localStorage或sessionStorage的保持這樣的數據,根據不同的目的。

+0

我想我可以使用一個工廠,據我所知,這個工廠可以「新」起來。無論哪種方式,只要我有一個可以讓服務器調用並響應我的特定方法調用的對象。你認爲你可以提供一個如何做這項工作的例子嗎? – Nathan 2015-01-31 22:16:03

+0

嗯,這是基本的東西,它只取決於你想如何使用它。也許一個模塊運行塊可能是最簡單的:https://docs.angularjs.org/guide/module – Shomz 2015-01-31 23:42:07