Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angularjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何从另一个服务AngularJS访问承诺_Javascript_Angularjs - Fatal编程技术网

Javascript 如何从另一个服务AngularJS访问承诺

Javascript 如何从另一个服务AngularJS访问承诺,javascript,angularjs,Javascript,Angularjs,我的服务有一个来自另一个服务的承诺。我想直接访问数据 这是我服务的一小部分: factory('CalculationFactory', function(SizeFromPipe){ var input = { sizes: function(pipe_id){ var sizesFromPipes = SizeFromPipe.getSizes(pipe_id); sizesFromPipes.then(function(val

我的服务有一个来自另一个服务的承诺。我想直接访问数据

这是我服务的一小部分:

  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;
  }).
这是我的“数据服务”:

我想从我的控制器执行此操作:

$scope.sizes = CalculationFactory.sizes(pipe_id)
但是我没有定义

有什么想法吗


更新:添加了数据服务。我知道我可以用访问这个。然后。。来自控制器。我真的很想保持我的控制器干净,因此如果可以在我的模型中解决这个问题,那就太好了。

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

尽管您希望做正确的事情,但仍然会被异步性愚弄

可能是这样的:

  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;          
         });
     },
  }).

我个人保持资源工厂干净,而是在
$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');
})

工厂('CalculationFactory'
)的末尾,您是否返回了任何内容?是的,当然。修复了它。Thxare您确定
CalculationFactory.input.sizes(管道id)
有效吗?我想应该是
CalculationFactory.sizes(管道id)
啊,抱歉。修复了它。我的实际模型中还有一层。我认为我们需要以某种方式自定义控制器创建过程,以便仅在解决所有依赖关系时创建控制器。(我还不知道如何做)
something.factory("Pipe", function($resource) {
  return $resource('/api/sizes/fromPipe/:id');
})