Javascript中的返回值,但结果是未定义

Javascript中的返回值,但结果是未定义,javascript,angularjs,Javascript,Angularjs,我是Javascripts新手,我正在尝试使用AngularUI路由,下面是我的代码 myApp.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider) { $stateProvider .state('home', { url: '/test', templateUrl: '/cus

我是Javascripts新手,我正在尝试使用AngularUI路由,下面是我的代码

myApp.config(['$stateProvider', '$urlRouterProvider',function($stateProvider, $urlRouterProvider) {     
    $stateProvider  
        .state('home', {
            url: '/test',
            templateUrl: '/custom.html'
        })
        .state('detail', {                
            url: '/{examID}',              
            views: {
            '': {
              templateUrl: '/templates/customize.html',
               controller: ['$scope', '$stateParams', 'utils',

                function ( $scope,$stateParams,utils) {
                  $scope.exam = utils.findById($stateParams.examID);
                  console.log('exam is ' + $scope.exam );
                }
                ]
        }            
            }
        }     )    

    }])
这就是具有findbyID功能的服务

angular.module('service', [])
.factory('utils', function ( $http) {
  return {
    findById: function findById(id) {
       $http.get('/api/exams/' + id).success(function(response) {
            return response;
    })}
};});
我已经关注了这个主题,但是$scope.exam仍然没有定义

另外,我试着打印出响应,它是一个对象


Thx

您必须等待ajax调用完成。将控制器中的代码修改为:

$scope.exam;
utils.findById($stateParams.examID).then(function(data) {
    $scope.exam = data.data;
}

阅读AngularJS和JavaScript中“承诺”的概念

使用延迟承诺,以便在响应后返回值

服务:

angular.module('service', [])
.factory('utils', function ( $http) {
  return {
    findById: function findById(id) {
       var promise=$http.get('/api/exams/' + id);
   return promise;
};});
   myApp.config(['$stateProvider', 
  '$urlRouterProvider',function($stateProvider, $urlRouterProvider) {     
            $stateProvider  
                .state('home', {
                    url: '/test',
                    templateUrl: '/custom.html'
                })
                .state('detail', {                
                    url: '/{examID}',              
                    views: {
                    '': {
                      templateUrl: '/templates/customize.html',
                       controller: ['$scope', '$stateParams', 'utils',

                        function ($scope, $stateParams, utils) {
                                                   utils.findById($stateParams.examID).then(function(value) {
                        $scope.exam = value;
                        console.log('exam is ' + $scope.exam );
                         });

                        }
                        ]
                       }           
                    }
                })    
        }])
控制器:

angular.module('service', [])
.factory('utils', function ( $http) {
  return {
    findById: function findById(id) {
       var promise=$http.get('/api/exams/' + id);
   return promise;
};});
   myApp.config(['$stateProvider', 
  '$urlRouterProvider',function($stateProvider, $urlRouterProvider) {     
            $stateProvider  
                .state('home', {
                    url: '/test',
                    templateUrl: '/custom.html'
                })
                .state('detail', {                
                    url: '/{examID}',              
                    views: {
                    '': {
                      templateUrl: '/templates/customize.html',
                       controller: ['$scope', '$stateParams', 'utils',

                        function ($scope, $stateParams, utils) {
                                                   utils.findById($stateParams.examID).then(function(value) {
                        $scope.exam = value;
                        console.log('exam is ' + $scope.exam );
                         });

                        }
                        ]
                       }           
                    }
                })    
        }])

这是一个让许多新接触JavaScript的开发人员感到困惑的地方

这里发生的事情是将
utils.findById()
的返回值赋值给
$scope.exam
。问题是
utils.findById()
实际上并没有返回任何内容。(当函数在JavaScript中没有显式的
return
语句时,返回值是隐式的
undefined

以下是您的服务的外观:

angular
  .module('service', [])
  .factory('utils', function ($http) {
    return {
      findById: function (id) {
        return $http.get('/api/exams/' + id);
      }
    };
  });
您可能注意到对
.success()
的调用也消失了!别担心。它只是移动了一下

我们不想在
$http.get()
上调用
.success()
,而是想在
utils.findById()
上调用它。这样做将使您能够访问控制器中的
响应
变量。由于您将有权访问
response
变量,因此可以将
response
分配给
$scope.exam
,如下所示:

.state('detail', {
  url: '/{examID}',
  views: {
    '': {
      templateUrl: '/templates/customize.html',
      controller: ['$scope', '$stateParams', 'utils',
        function ($scope, $stateParams, utils) {
          utils.findById($stateParams.examID)
            .success(function (response) {
              $scope.exam = response;
            });
        }
      ]
    }
  }
});

希望这件事能澄清。如果我对任何事情都不清楚,请告诉我,以便我可以更新此答案。

耶!:我很高兴能帮上忙。