我有这个问题占用了我太多的开发时间。我已经研究了很多这个问题,现在让我来到这里。
我正在从服务中发出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
请求的信息。
我该如何解决这个问题?
答案 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)
由于 getAllTasks()是一个承诺, someData会在承诺准备就绪之前先记录 ..所以不要将回调数据分配给 someData 在回调范围内,只需将数据传递给函数,然后再从那里做任何事情......
示例:
ajaxSrvc.getAllTasks().then(function(data) {
doSomethingWithData(data);
});
//然后
$scope.doSomethingWithData = function(data){
$scope.someData = data;
console.log($scope.someData);
}
希望这有帮助。