AngularJS 承诺处理 CoffeeScript 类

Posted

技术标签:

【中文标题】AngularJS 承诺处理 CoffeeScript 类【英文标题】:AngularJS promise handling with CoffeeScript class 【发布时间】:2013-09-28 09:48:03 【问题描述】:

我在理解服务处理承诺中的行为时遇到了一些问题。在下面的代码中,我有一个异步调用服务器。尝试在 .then 调用中使用 @$rootScope 是不可能的。但是将 @$rootScope 分配给类 _rs 中的属性就可以了。我不明白为什么?

namespace( 'com.myapp.service'

  SessionService:

    class SessionService

      _rs = null
      _this = null

      # Specify expected constructor services
      @$inject  : ["$rootScope", "$log", "User" ]

      constructor : (@$rootScope, $log, @User) ->
        # Scope binding and this interpolation
        _rs = @$rootScope
        _this = @

        $log.debug("Calling constructor of SessionService")
        @currentUser = ""

        @initCurrentUser()

        return this

      loadCurrentUser : () ->
        return serverFunctions().func('sessionService').loadCurrentUser("async")

      initCurrentUser : () ->
        result = @loadCurrentUser()

        result.then (res) ->
          _rs.$apply ->
            _this.currentUser = "test"

        result.fail (e) ->
          _rs.$apply ->
            console.error(e)

      # Returns current user
      getCurrentUser: () ->
        return _this.currentUser
)

此外,当我在 getCurrentUser 方法中使用 @currentUser 而不是 _this.currentUser 时,它不起作用。控制器中的 UI 只是没有更新。

感谢您的帮助!

【问题讨论】:

好的,自己找到了:***.com/questions/8965855/…DOH 我想我会在服务对象的属性的当前范围内使用 $watch 来解决这个问题。 【参考方案1】:
namespace( 'com.myapp.service'

  SessionService:

    class SessionService

      # Specify expected constructor services
      @$inject  : ["$rootScope", "$log", "User" ]

      constructor : (@$rootScope, $log, @User) ->

        $log.debug("Calling constructor of SessionService")
        @currentUser = ""

        @initCurrentUser()

        return this

      loadCurrentUser : () ->
        return serverFunctions().func('sessionService').loadCurrentUser("async")

      initCurrentUser : () =>
        result = @loadCurrentUser()

        result.then (res) =>
          @$rootScope.$apply =>
            @currentUser = "test"

        result.fail (e) =>
          @$rootScope.$apply =>
            console.error(e)

      # Returns current user
      getCurrentUser: () =>
        return @currentUser
)

【讨论】:

以上是关于AngularJS 承诺处理 CoffeeScript 类的主要内容,如果未能解决你的问题,请参考以下文章

Angularjs 承诺拒绝链

AngularJS 资源承诺

AngularJS 测试 - 来自服务的承诺无法解决

使用 AngularJS 立即返回一个已解决的承诺

你能在返回之前解决一个 angularjs 承诺吗?

AngularJS 中的链式承诺