2016-08-15 61 views
0

我在写一个可以从JASON文件中调用DATA的代码。 我有一个异步的问题,并看到很多关于同一问题的帖子。等到所有数据加载完毕。 AngularJS

我写了一些代码,我想它会解决我的问题。然而,它似乎仍然没有加载数据。

我会更具体的与我的问题。我用下面的诺言方法。我认为在所有数据完全加载之前不应该返回“问题”。显然,'问题',里面什么都没有,会返回到我的页面。

我的承诺方法是否正确?如果不是,我该如何解决这个问题。 有人可以帮我吗?

(function(){ 

angular 
    .module("GrammarQuiz") 
    .factory("DataService", DataFactory); 
    function DataFactory($log, $q, $http, $timeout){ 
     var vm = this 
     var questions = getData() ; 
     vm.getData = getData; 

     function getData(){ 
      var defer = $q.defer() 
      $http.get('api/data1.json') 
      .success(function(res){ 
       questions = res; 
       $log.log('success'); 
       defer.resolve(res); 
      }) 
      .error(function(err, status){ 
       $log.log('fail'); 
       defer.reject(err); 
      }) 
      return defer.promise; 
     } 


     $log.log('check'); 
     $log.log(questions[0]); 

     return questions; 
    } 


})(); 
+0

的[可能的复制如何返回从一个异步响应打电话?](http://stackoverflow.com/questions/14220321/how-do-i-return-the-response-from-an-asynchronous-call) –

+0

是的,我看过这个帖子,但仍然无法确定在我的代码中解决问题的方法。我不确定是什么问题。 :( –

+0

这是在这里的竞争条件城市,你故意拖延某些东西的http请求,以便尝试记录它,或者在成功函数中调用函数,或者使用承诺 – ryanlutgen

回答

1

你所显示的不是使用Promise的正确方法。相反,你应该做类似下面的东西:

厂(服务)

.factory("DataService", DataFactory); 

function DataFactory($http) { 
    var service = {}; 
    service.getData = function() { 
     return $http.get('api/data1.json') 
      .then(function(response) { 
       return response.data; 
      }); 
     }; 
    return service; 
} 

控制器

.controller("MyController", MyController); 

function MyController($scope, DataService) { 
    $scope.questions = {}; // or $scope.questions = []; if the return type is an array 
    DataService.getData() 
     .then(function(data) { 
      $scope.questions = data; 
     }) 
     .catch(function(errorResponse) { 
      // do something with the error 
     }); 
} 
0

您在这里遇到了一些与异步代码有关的问题,就像您在文章中提到的那样。

第一个问题是,你尝试登录,它尚未与该代码存在的数据:

$log.log(questions[0]) 

这是正在运行得到的数据如此明显的数据不是招”的要求后,立即尚未加载。它将打印什么去控制台?可能undefined或类似的东西。

如果你想记录你的问题数据,你需要在$ http.get成功函数中做到这一点。

$http.get('api/data1.json') 
    .success(function(res){ 
     questions = res; 
     $log.log('success'); 
     $log.log(questions); 
     defer.resolve(res); 
    }) 

其次,你使用$q.defer创建一个承诺未来但这是完全不必要的,因为$http.get已经返回其在.success()功能执行的承诺。因此,请删除任何额外的承诺来简化您的代码,并使用$http.get

除了在.success()函数中,不要指望数据在其他地方可用。

+0

我不想记录我的问题数据。我需要充满数据的“问题”并将其返回给其他控制器,以便我可以在数据中使用信息。到现在为止,问题没有任何数据就被返回。你能告诉我该怎么做吗?或者你能否至少告诉我一个使用诺言的方式? –

相关问题