Javascript 如何在AngularJS中将承诺传递给控制器

Javascript 如何在AngularJS中将承诺传递给控制器,javascript,angularjs,promise,angular-promise,Javascript,Angularjs,Promise,Angular Promise,我很难理解承诺。我有一个函数$scope.startJob,当调用它时,它会调用SegmentsService中的AreAvailableSegments。其思想是AreTheAvailableSegments应该返回true或false,以便我可以在控制器中处理此行为,但不确定如何执行此操作 AreTheAvailableSegments调用getSegments,从数据库请求文本段。getSegments返回一个承诺,我正在尝试用处理这个承诺。然后在AreTheAvailableSegmen

我很难理解承诺。我有一个函数$scope.startJob,当调用它时,它会调用SegmentsService中的AreAvailableSegments。其思想是AreTheAvailableSegments应该返回true或false,以便我可以在控制器中处理此行为,但不确定如何执行此操作

AreTheAvailableSegments调用getSegments,从数据库请求文本段。getSegments返回一个承诺,我正在尝试用处理这个承诺。然后在AreTheAvailableSegments中,但不确定如何传递给控制器

这是我的Segments工厂,它返回$resource对象segmentsfactory.js:

这是我的细分服务,segmentsservice.js:

执行时,控制台不显示要转换的段,因为SegmentsService不返回true或false


如何解决这个问题?

没有理由同时使用服务和工厂。删除出厂代码并将该代码移到服务中。至于您的问题,您必须使用$q模块来返回承诺$q


然后,您必须在控制器中处理承诺。

没有理由同时使用服务和工厂。删除出厂代码并将该代码移到服务中。至于您的问题,您必须使用$q模块来返回承诺$q

然后,您必须在控制器中处理承诺。

函数AreTheAvailableSegments也应返回承诺。 然后在你的控制器中,你有一个then案例,还有你的if else

this.areThereAvailableSegments = function(jobId) {
      var dump = [];

      // queries for all segments
      return this.getSegments(jobId) //Return here
      .then(function(segments) {
        // dumps segments status in a temp array
        for (var i = 0; i < segments.length; i++) {
          dump.push(segments[i].status);
        }
        // returns true if there is an 'available' in the temp array
        if (dump.indexOf('available') >= 0) {
          return true; 
        } else {
          return false;
        }
      });
    };
函数arethereavailablesegments也应该返回一个承诺。 然后在你的控制器中,你有一个then案例,还有你的if else

this.areThereAvailableSegments = function(jobId) {
      var dump = [];

      // queries for all segments
      return this.getSegments(jobId) //Return here
      .then(function(segments) {
        // dumps segments status in a temp array
        for (var i = 0; i < segments.length; i++) {
          dump.push(segments[i].status);
        }
        // returns true if there is an 'available' in the temp array
        if (dump.indexOf('available') >= 0) {
          return true; 
        } else {
          return false;
        }
      });
    };

我会这样设置…在你的工厂完成承诺,然后调用控制器中的数据

在您的服务中:

    .factory('SegmentsFactory', function ($resource) {

             var APIRequest = {};

            APIRequest.getSegments = function(id){
                    segmentsAPI = $resource('http://localhost:3000/api/v1/segments/'+id'', ;
                    return segmentAPI.get().$promise.then(function(segments){
                        console.log(segments);
                        return segments;
                    });
                };

        return APIRequest;
}]);
然后在控制器中:

var dump = [];
        $scope.startJob = function() {

          if (SegmentsService.areThereAvailableSegments) {
             APIRequest.getSegments($scope.id).then(function(data){
                        if (data.error){
                            //error stuff here
                        } else {
                            if (data.segments.length > 0){
                                for(var i=0; i < segments.length; i++){
                                console.log(segments);
                                dump.push(segments[i].status);
        }

    };

我会这样设置…在你的工厂完成承诺,然后调用控制器中的数据

在您的服务中:

    .factory('SegmentsFactory', function ($resource) {

             var APIRequest = {};

            APIRequest.getSegments = function(id){
                    segmentsAPI = $resource('http://localhost:3000/api/v1/segments/'+id'', ;
                    return segmentAPI.get().$promise.then(function(segments){
                        console.log(segments);
                        return segments;
                    });
                };

        return APIRequest;
}]);
然后在控制器中:

var dump = [];
        $scope.startJob = function() {

          if (SegmentsService.areThereAvailableSegments) {
             APIRequest.getSegments($scope.id).then(function(data){
                        if (data.error){
                            //error stuff here
                        } else {
                            if (data.segments.length > 0){
                                for(var i=0; i < segments.length; i++){
                                console.log(segments);
                                dump.push(segments[i].status);
        }

    };

此函数不能返回true或false,因为它不知道调用是否成功。函数的执行方式是在承诺有机会得到解决之前。简而言之,承诺是异步的。这个函数不能返回true或false,因为它不知道调用是否成功。函数的执行方式是在承诺有机会得到解决之前。简而言之,承诺是异步的。原始代码很好,但不建议您使用延迟反模式。dfsq,想知道为什么会使用此反模式吗?原始代码很好,但不建议您使用延迟反模式。dfsq,想知道为什么会出现这种反模式吗?我会改进服务,只返回dump.indexOf'available'>=0;,但另一方面,这是正确的答案。谢谢。我非常喜欢这种方法,非常干净。我会改进服务,只返回dump.indexOf'available'>=0;,但另一方面,这是正确的答案。谢谢。我真的很喜欢这种方式,很干净。
    .factory('SegmentsFactory', function ($resource) {

             var APIRequest = {};

            APIRequest.getSegments = function(id){
                    segmentsAPI = $resource('http://localhost:3000/api/v1/segments/'+id'', ;
                    return segmentAPI.get().$promise.then(function(segments){
                        console.log(segments);
                        return segments;
                    });
                };

        return APIRequest;
}]);
var dump = [];
        $scope.startJob = function() {

          if (SegmentsService.areThereAvailableSegments) {
             APIRequest.getSegments($scope.id).then(function(data){
                        if (data.error){
                            //error stuff here
                        } else {
                            if (data.segments.length > 0){
                                for(var i=0; i < segments.length; i++){
                                console.log(segments);
                                dump.push(segments[i].status);
        }

    };