2016-08-15 26 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

我不想記錄我的問題數據。我需要充滿數據的「問題」並將其返回給其他控制器,以便我可以在數據中使用信息。到現在爲止,問題沒有任何數據就被返回。你能告訴我該怎麼做嗎?或者你能否至少告訴我一個使用諾言的方式? –

相關問題