2016-12-06 89 views
0

我有这个问题,占用了我太多的开发时间。我已经研究了这个问题,现在我已经到了这里。如何从角度打印出GET请求中的信息

我正在通过服务发出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请求的信息。

我该如何解决这个问题?

+1

我不知道角度,但忽略这一点,你需要等到ajax调用返回。您在请求完成后立即打印它。将日志语句放在回调中。 – mrmcgreg

+0

你的日志语句'console.log(data)'打印出预期的结果吗? – yuxhuang

+0

你不能指望异步调用像你想象的那样以同步方式工作,你可以在ajax调用成功的时候获得数据,这将在'.then'函数中。 –

回答

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

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

1

由于getAllTask​​s()是一种承诺,someData将首次登录之前的承诺已准备就绪。所以代替回调范围内分配回调数据someData,只是通过数据一个函数,而不是再从那里做什么..

例子:

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

       doSomethingWithData(data); 
     }); 

//然后

$scope.doSomethingWithData = function(data){ 

     $scope.someData = data; 

     console.log($scope.someData); 

} 

希望这有助于。