2017-02-06 16 views
0

私はJavascriptの初心者で、約束事と非同期性を理解しようとしていますが、難しかったです。コントローラで関数を呼び出すときにサービスを待つ

私は私のサービスでこの機能を持っている:

`main.service.js

function getTableauUrl() { 

    $http.get(TABLEAU_URLS).then(function (response) { 
     var urls = response.data; 
     getUser().then(function (data) { 
     var company = data.account.name; 
     for (var i=0; i< response.data.length; i++){ 
      if (urls[i].name === company){ 
      return urls[i].url; 
      } 
     } 

     }, function errorGetUser(error) { 
     $log.info(error); 
     }); 
    } 
); 
} 

を、私はすぐにそれを使用する場合、この機能は正常に動作しますが、私は、コントローラからそれを呼び出す場合:

function MainController ($log, $rootScope, $scope, $sce, $q, $state, 
          mainService) { 

var url = mainService.getTableauUrl(); 

    } 

次に、変数urlは未定義です。私はそれがJavascriptの非同期的な振る舞いのためだと知っていますが、約束を加えるためにそれを修正しようとしましたが、私はチュートリアルを読んでいました。

答えて

0

あなたはそのメソッドから何も返されません。

function MainController ($log, $rootScope, $scope, $sce, $q, $state, mainService) {  
    var globalUrl; 

    mainService.getTableauUrl().then(function(url) { 
     globalUrl = url; 
    }); 
} 
+0

私はあなたが言ったことを試みたが、それはまだ、undefinedを返します。その後、以下のようなあなたのコントローラでそれを呼び出す$http.get

function getTableauUrl() { return $http.get(TABLEAU_URLS).then(...); } 

を返してみてください。 – ares1986

関連する問題