如何从角度服务中获得承诺的价值?

时间:2015-01-31 21:40:23

标签: angularjs angular-promise angular-resource

我正在使用$ resource,但可以轻松使用$ 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

1 个答案:

答案 0 :(得分:1)

  

但无论我如何尝试,我只能从我的服务对象获得一个承诺,并且必须使用.then方法来解决这个承诺。

承诺是如何运作的。

由于Angular中的服务是单身,所以好处是你不必重复这个动作。不好的是,你必须在某个时刻做一次。

从技术上讲,您可以在app init上执行此操作,运行提取并将其存储到服务变量中。然后,您只需要从控制器读取该变量。

因此,您正处于正确的轨道上,只需确保在应用加载时和用户互动开始之前初始化该服务。


如果您正在寻找开箱即用的解决方案,请考虑将此类数据保存在localStorage或sessionStorage中,具体取决于目的。