0

を返す前に、$ HTTP要求を解決し、私は次のようになりますプロバイダを持っている:Angularjsプロバイダ:

angular.module('myProvider', function(){ 
    var appUrl = '' 
    this.setAppUrl = function(url){ 
    appUrl = url; 
    } 
    this.$get = ['$http', function($http){ 
    return { 
     appAction: function(){ 
     $http.get(appUrl).then(function(response){ 
      //do stuff 
     }); 
     } 
    } 
    }] 
}); 

現在アプリがビルドの一部として生成された定数に基づいての.configブロックにappUrlを設定し、プロセスを不平等にする。

私は、$ http経由でjsonファイルから設定ファイルを読み込むようにアプリケーションを変更しようとしています。プロバイダーは今、このようなものになります。これは、リモートソースから設定をロード

angular.module('myProvider', function(){ 
    this.$get = ['$http', function($http){ 
    return $http.get('path/to/config.json').then(function(response){ 
     appUrl = response.appUrl; 
     return { 
     appAction: function(){ 
      $http.get(appUrl).then(function(response){ 
      //do stuff 
      }); 
     } 
     } 
    }); 
    }] 
}); 

を、実際の機能の代わりに約束を返すの不要な副作用があります。私はプロバイダから値を返す前に約束を解決しようとしました(失敗した)。私は返される関数の代わりに約束を期待するために、残りのアプリケーションを変更したくありません。このメソッドが関数を返すことを確認する最良の方法は何ですか?

+0

これはうまくいくと思いますか?あなたは非同期オペレーションを実行しています。そして、モダウスオペランドは約束を使用することです。あなたは約束を守ることはできません(そして、そうすべきでもありません)。また、それを同期呼び出しのように扱うことはできません。 –

+0

元のコードを保管してください。アプリケーションが読み込まれたら、config.jsonファイルを読み込み、response.appUrlでsetAppUrlをロードしてください。 – Hoyen

+0

@Hoyen何かが見逃されていない限り、.configブロックで$ httpを使用できません。 – biagidp

答えて

1

サービスのappActionメソッドは、とにかく約束を返します。 appUrlの値を保持します。nullでない場合は、データを取得するためにこの値を使用します。さもなければ、私たちは約束を繋ぎ合わせます:最初に設定を取り出してから、実際のデータを取り出します。次のようなもの:

angular.module('myProvider', function(){ 
    this.$get = ['$http', function($http){ 
    var appUrl; 

    function retrieveTheRealData() { 
     return $http.get(appUrl).then(function(response){ 
     //do stuff 
     }); 
    } 

    return { 
     appAction: function() { 
     if(appUrl) { 
      return retrieveTheRealData(); 
     } 
     else { 
      return $http.get('path/to/config.json').then(function(response){ 
      appUrl = response.appUrl; 
      return retrieveTheRealData(); 
      }); 
     } 
     } 
    }; 
    }] 
}); 
関連する問題