回调范围未访问 AngularJS 服务中的函数

Posted

技术标签:

【中文标题】回调范围未访问 AngularJS 服务中的函数【英文标题】:Callback scope not accessing function in AngularJS Service 【发布时间】:2015-08-10 19:10:29 【问题描述】:

我有一个 AngularJS 服务,其代码如下。我做了 2 个 Promises,然后想调用该服务的功能。但是,由于回调在不同的范围内,我无法继续。知道该怎么做吗?

app.service "ServiceName", [                                 

  "AnotherService"                                                                
  "MyService"                                                                   

  (AnotherService, MyService) ->                                                         

    @dataFromA = []                                                       
    @dataFromB = []                                                    

    @mashupData = () ->                                           
      debugger                                                           

    @getDatafromA = () ->
      //getDataFromDBAndReturn

    @mainServiceFunction = () ->                              
      @getDatafromA().then (response) ->              
        @dataFromA = response                                          
        MyService.dataFromB().then (response) ->         
          @dataFromB = response                                           
          @mashupData() //Gives Undefined Error                                           

return                       
]

理想情况下,在调用 mainservicefunction 时,我希望它从 A、n B 获取数据,然后运行 ​​mashupData,它使用 @dataFromA@dataFromB

我该怎么做呢?

【问题讨论】:

Scope in coffeescript classes 的可能重复项 【参考方案1】:

您无需在 coffeescript 中使用 .bind - 它作为语言的一部分受到支持。用=> 箭头(维护this 的函数)替换所有-> 箭头(普通JS 函数):

(AnotherService, MyService) ->                                                         

  @dataFromA = []                                                       
  @dataFromB = []                                                    

  @mashupData = () =>                                           
    debugger                                                           

  @getDatafromA = () =>
    //getDataFromDBAndReturn

  @mainServiceFunction = () =>                              
    @getDatafromA().then (response) =>              
      @dataFromA = response                                          
      MyService.dataFromB().then (response) =>         
        @dataFromB = response                                           
        @mashupData() // Will corretly resolve `this`                                       

【讨论】:

【参考方案2】:

只需将正确的上下文与Function.prototype.bind 绑定:

app.service "ServiceName", [                                 

  "AnotherService"                                                                
  "MyService"                                                                   

  (AnotherService, MyService) ->                                                         

    @dataFromA = []                                                       
    @dataFromB = []                                                    

    @mashupData = () ->                                           
      debugger                                                           

    @getDatafromA = () ->
      debugger

    @mainServiceFunction = () ->                              
      @getDatafromA().then ( (response) ->              
        @dataFromA = response                                          
        MyService.dataFromB().then ( (response) ->         
          @dataFromB = response                                           
          @mashupData()                                          
        ).bind(this)
      ).bind(this)
]

【讨论】:

以上是关于回调范围未访问 AngularJS 服务中的函数的主要内容,如果未能解决你的问题,请参考以下文章

回调函数无法访问父函数范围内的变量

AngularJS 中的 401 未经授权的错误处理

AngularJS指令范围绑定未在链接函数中立即填充

在 AngularJS 中设置 JSONP 回调函数

Angularjs 范围之外的服务功能

复选框未绑定到angularjs中的范围