【问题标题】:ngresource factory returns undefinedngresource 工厂返回未定义
【发布时间】:2016-03-01 19:21:52
【问题描述】:

我正在使用 ngresource 编写工厂,尽管它在成功回调中打印值,但它不会将值返回给控制器。我在控制台中收到 Undefined。

.controller('loginCtrl', function($scope,loginInfoService) {
console.log(loginInfoService.getJsonId());
})

.factory('accessUrlService', ['$resource',function($resource){
return $resource('ip/Web/ws/login/restLogin');
}])


.factory('loginInfoService', ['accessUrlService',function(accessUrlService){

return  {
    getJsonId: function() {         
                accessUrlService.save({"login":"admin","password":"log","role":"Admin"},function(data){
                console.log(data.jsessionId);                           
                return data;                                
                });     
            }
        }

}])

【问题讨论】:

    标签: angularjs api callback ngresource


    【解决方案1】:

    我不得不在这里使用 $q 服务。我将 $q 作为参数传递给我的工厂,然后推迟响应,直到我收到来自服务器的响应。

    这是修改后的工厂

    .factory('loginInfoService',['accessUrlService','$q',function(accessUrlService,$q){
      return  {
    getJsonId: function() {  
        var deferred = $q.defer();
          accessUrlService.save({"login":"admin","password":"log","role":"Admin"},function(data){
           deferred.resolve(data); 
        },function(error){
            console.log("eror");
            deferred.reject(error);
        }); 
    
        return deferred.promise;
        }
    }
    }])
    

    我在控制器中这样调用它。

    .controller('loginCtrl', function($scope,loginInfoService) {
      loginInfoService.getJsonId().then(function(data){
    console.log(data.jsessionId);
      },function(error){
    console.log(error+ " Error" )
      });
    })
    

    如果我可以改进此代码,请告诉我。

    【讨论】:

      【解决方案2】:

      我认为您应该尝试在您的 getJsonId 方法中声明 return 语句

      getJsonId: function() {         
                      return accessUrlService.save({"login":"admin","password":"log","role":"Admin"},function(data){
                      console.log(data.jsessionId);                           
                      return data;                                
                      });     
                  }
      

      并在您的controller 中调用此方法

      loginInfoService.getJsonId().$promise.then(function(response){ console.log(response); });
      

      【讨论】:

      • 感谢您的回复。我尝试了您的代码,但收到错误消息TypeError: loginInfoService.getJsonId(...).then is not a function。可能是因为我使用的是 ngresource 而不是 http。
      • 已更新。控制器调用服务时添加“$promise”
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-03-12
      • 1970-01-01
      • 2017-07-15
      相关资源
      最近更新 更多