我正在使用以下获取服务..
fieldServices.factory('serverField', ['$resource',
function($resource){
return {
particularField : $resource('http://localhost:8080/Omniview/rest/fields/:fieldId', {}, {
get: {method:'GET', isArray:false}
})
};
}]);
这是我的控制器使用获取数据:
$scope.allFields;
serverField.fieldList.get(function(data){
//console.log(data);
$scope.allFields=data;
});
console.log($scope.allFields);
在上面的情况下,由于未使用数据设置allFields,因此未定义 但在下面的情况下:
$scope.allFields;
serverField.fieldList.get(function(data){
//console.log(data);
$scope.allFields=data;
});
setTimeout(function(){
console.log($scope.allFields);
},1000) ;
它给了我正确的对象。我不知道为什么。可以有人解释我为什么会这样,我该如何摆脱它。
答案 0 :(得分:0)
在您的代码中:
$scope.allFields;
serverField.fieldList.get(function(data){
$scope.allFields=data;
});
console.log($scope.allFields);
console.log
行在get
被触发后立即执行,但在服务器调用返回响应之前执行。一个" AJAX"这样的调用是异步的。
get
中的功能是成功回调。当服务器响应您的get
请求时,将执行此功能。只有这样才能设置$scope.allFields
。
setTimeout
"工作的原因"是因为它不会使服务器响应请求,所以当超时触发时,成功回调将被触发。
运行此代码时可以看到此异步行为:
console.log('1 - Before get');
serverField.fieldList.get(function(data){
console.log('2 - Get success callback');
});
console.log('3 - After get');
您将看到按此顺序记录的行:
1 - Before get
3 - After get
2 - Get success callback
答案 1 :(得分:0)
简单来说,get调用是异步的。如果你没有引入延迟,很可能异步调用仍在等待返回 - 因此,$ scope.allFields是未定义的。
但是如果你确实引入了延迟,那么当你登录到控制台时可能会返回异步调用 - 并且等待的时间越长就越有可能。