如何访问来自其他服务的承诺,AngularJS

时间:2014-01-03 12:31:43

标签: javascript angularjs

我的服务承诺来自其他服务。我想直接访问数据。

这是我服务的一小部分:

  factory('CalculationFactory', function(SizeFromPipe){
     var input = {
       sizes: function(pipe_id){
         var sizesFromPipes = SizeFromPipe.getSizes(pipe_id);
         sizesFromPipes.then(function(val){
          console.log(val); //Is an object
          return val; 
         });
     }
     return input;
  }).

这是我的“dataservice”:

 factory('SizeFromPipe', function($resource, $q){
    return {
      getSizes:  function(pipe_id){
        var deffered = $q.defer();
        $resource('/api/sizes/fromPipe/:id', {'id':'@id'})
          .query({id:pipe_id},
          function(sizes){
            deffered.resolve(sizes);
          },
          function(response){
            deffered.reject(response);
          });

        return deffered.promise;
      }
    };
  })

我想从我的控制器那里做到这一点:

$scope.sizes = CalculationFactory.sizes(pipe_id)

我虽然未定义。

有什么想法吗?

更新:添加了数据服务。我知道我可以通过.then ..从控制器访问它。我真的很想保持我的控制器清洁,所以如果可能在我的模型中处理这个问题,那就太棒了。

2 个答案:

答案 0 :(得分:0)

警告:这都是未经测试的,我不确定这是最好的解决方案。如果你想要防弹的东西,请等待更专业的人。

虽然你想做正确的事,但你仍然被异步性所迷惑。

可能是这样的:

  factory('CalculationFactory', function(PipeCalculation, SizeFromPipe){
     var input = {
       sizes: function(pipe_id){
         return SizeFromPipe.getSizes(pipe_id);              
         });
     },
  }).

 // in controller
 CalculationFactory.input.sizes(pipe_id).then(function(promise){
     $scope.sizes = promise;   
 })

......会有所帮助。

但是,有很多方法可以实现这一目标。看看PipeCalculation的代码也会有所帮助。也许你正在过度思考复杂的事情。

另一种方法是返回新的承诺

factory('CalculationFactory', function(PipeCalculation, SizeFromPipe){
     var input = {
       sizes: function(pipe_id){

           // Assume that $q is available
           var defer = $q.defer();

           SizeFromPipe.getSizes(pipe_id).then(function(promise){
             defer.resolve(promise);
           })

           return defer.promise;          
         });
     },
  }).

答案 1 :(得分:0)

我个人保持资源工厂清洁,而不是在$routeProvider中使用resolve,并找到了通过$route.current.scope访问范围变量的方法。所以,在那里分配。 当路由更改其自动从服务器获取响应时,控制器中没有代码。

resolve: {
  anyname: function($route, Pipe) {
    Pipe.query($route.current.params, function(data) {
      $route.current.scope.some_variable = data;
    });
  }
}

资源

something.factory("Pipe", function($resource) {
  return $resource('/api/sizes/fromPipe/:id');
})