【问题标题】:Callback scope not accessing function in AngularJS Service回调范围未访问 AngularJS 服务中的函数
【发布时间】: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

我该怎么做呢?

【问题讨论】:

标签: javascript angularjs callback coffeescript promise


【解决方案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)
    ]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-01-05
      • 1970-01-01
      • 2013-03-03
      • 2012-11-05
      • 2014-09-22
      • 1970-01-01
      • 2015-11-11
      相关资源
      最近更新 更多