2016-12-06 88 views
0

我有這個問題,佔用了我太多的開發時間。我已經研究了這個問題,現在我已經到了這裏。如何從角度打印出GET請求中的信息

我正在通過服務發出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請求的信息。

我該如何解決這個問題?

+1

我不知道角度,但忽略這一點,你需要等到ajax調用返回。您在請求完成後立即打印它。將日誌語句放在回調中。 – mrmcgreg

+0

你的日誌語句'console.log(data)'打印出預期的結果嗎? – yuxhuang

+0

你不能指望異步調用像你想象的那樣以同步方式工作,你可以在ajax調用成功的時候獲得數據,這將在'.then'函數中。 –

回答

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

這不工作,因爲這是一個異步操作,所以基本上的console.log(someData)獲取調用之前你實際上得到的數據。它永遠不會工作。

1

由於getAllTask​​s()是一種承諾,someData將首次登錄之前的承諾已準備就緒。所以代替回調範圍內分配回調數據someData,只是通過數據一個函數,而不是再從那裏做什麼..

例子:

ajaxSrvc.getAllTasks().then(function(data) { 

       doSomethingWithData(data); 
     }); 

//然後

$scope.doSomethingWithData = function(data){ 

     $scope.someData = data; 

     console.log($scope.someData); 

} 

希望這有助於。