如何从角度中的GET请求中打印出信息

时间:2016-12-06 20:04:54

标签: javascript angularjs

我有这个问题占用了我太多的开发时间。我已经研究了很多这个问题,现在让我来到这里。

我正在从服务中发出GET请求。正在从控制器调用GET请求。

以下是发出GET请求的服务ajaxSrvc.js

app.service('ajaxSrvc', ['$log', 'Constants', '$http', '$q', 
    function($log, Constants, $http, $q) {
        this.getAllTasks = function() {
            var defer = $q.defer();

            var url = 'http://localhost:9998/tasks';
            $http.get(url, {cache: 'true'})
                .success(function(data) {
                    defer.resolve(data);
                });

                return defer.promise;
        };
    }
]);

从该控制器tasksCtrl.js调用该请求:

app.controller('tasksCtrl', ["$log", "$scope", "Constants","$location", "ajaxSrvc",
    function($log, $scope, Constants, $location, ajaxSrvc) {
        var someData = null;
        ajaxSrvc.getAllTasks().then(function(data) {
            console.log(data);
            someData = data;
        });

        console.log(someData); // This is printing NULL
    }
]);

当我尝试打印someData时出现问题,它打印为NULL,而不是包含来自GET请求的信息。

我该如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

问题是您需要等待异步功能才能完成。执行console.log(someData)时代码仍在异步函数中加载数据。您可以在.then函数内添加一个函数调用,该函数将在加载完成后执行。

如果console.log(data)返回预期值,您应该执行以下操作:

app.controller('tasksCtrl', ["$log", "$scope", "Constants","$location", "ajaxSrvc",
    function($log, $scope, Constants, $location, ajaxSrvc) {
        var someData = null;
        ajaxSrvc.getAllTasks().then(function(data) {
            console.log(data);
            someData = data;
            callWhenFinish();
        });

        function callWhenFinish(){
            console.log(someData);
        }
    }
]);

答案 1 :(得分:1)

这不起作用,因为这是一个异步操作,所以基本上在实际获取数据之前调用console.log(someData)。它永远不会奏效。

答案 2 :(得分:1)

由于 getAllTask​​s()是一个承诺, someData会在承诺准备就绪之前先记录 ..所以不要将回调数据分配给 someData 回调范围内,只需将数据传递给函数,然后再从那里做任何事情......

示例:

 ajaxSrvc.getAllTasks().then(function(data) {

               doSomethingWithData(data);
        });

//然后

$scope.doSomethingWithData = function(data){

      $scope.someData = data;

      console.log($scope.someData);

}

希望这有帮助。