获取具有时间延迟的请求返回对象

时间:2014-12-10 08:01:18

标签: javascript angularjs angularjs-directive angularjs-scope angular-ui

我正在使用以下获取服务..

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)  ;

它给了我正确的对象。我不知道为什么。可以有人解释我为什么会这样,我该如何摆脱它。

2 个答案:

答案 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是未定义的。

但是如果你确实引入了延迟,那么当你登录到控制台时可能会返回异步调用 - 并且等待的时间越长就越有可能。