2017-03-21 7 views
0

Constants.getContantsは、アプリケーションで使用されるすべての定数を取得する約束です。これを$ scope変数に保存して、コントローラやアプリケーションのどこにでもアクセスできるようにしたいと思います。今、私がそれにアクセスする必要があるときはいつも、私はその呼び出しを繰り返し、そこで操作を行う必要があります。 $スコープに保存しようとしても、対応するハンドラの外部では使用できません。この問題を解決する方法。

Constants.getConstants().then(function (AppContants) { 
      $scope.responseCount = AppContants.data.serverUrl+AppContants.data.appId 
     console.log($scope.responseCount); 
      //$scope.$apply(); 
    }); 

console.log($scope.responseCount); 

ここでAJAX呼び出しも同期しなくなるだろう:以下

は、私が使用しているコードです。ハンドラ関数の内部で実行する必要があることがわかっているので、AJAX呼び出しが成功した後に目的のアクションが実行されることを確認できます。私は関数の外でこれらの変数を使用する必要があります。私は$ scopeを試しました。$ apply()も同様です。それは助けになりませんでした。これを解決する方法はありますか?前もって感謝します。あなたのサービスで、あなたのケースで

this.getConstants= function($username){ 
     var endpoint = "url"; 
     return $http({ 
     method: 'get', 
     url: endpoint 
     }); 
    }; 
+0

あなたはそれが戻ることを期待していますか? 'then'コールバックの' AppContants'はあなたが期待するデータを持っていますか? –

+0

こんにちは@AnandMP、あなたが達成しようとしているシナリオを簡潔にしてくれれば分かりますか?それは私に良い理解を与えるでしょう –

答えて

0
Constants.getConstants().then(function(response) 
{ 
    $scope.responseCount = response.data; 
}, function(error) 
{ 
console.log(error); 

}); 

そして第二にconsole.logはちょうどAJAXコールをかけた後に実行されます。非同期呼び出しであるため、AJAXが応答するのを待つことはありません。

AJAX calが解決された後でも、 '$ scope.responseCount'プロパティは使用できません。アプリケーションの起動時に定数を取得し、いくつかのサービス(シェアードサービス)での定数を保存する

  1. 場所このコール:あなたができる回避策として

  2. このAJAX呼び出しの 'then'ブロックで操作を行います。
0

のようなものを持っている必要があり

0

ここが問題です。あなたがConstants.getConstants()であるとき、それは約束として応答を返します。 javascript非同期以来、それは応答が返るまで待たない。ただ実行し続けます。だからこそ、thenの外のコンソールは表示されません。その後、キャッシュされた約束を使用することができます

app.service("ConstantCache", function(Constants) { 
    var promiseCache; 
    this.getPromise = function() { 
     if (promiseCache } { 
      return promiseCache; 
     } else { 
      promiseCache = Constants.getConstants(); 
      return promiseCache; 
     }; 
    }; 
    this.trashCache = function() { 
     promiseCache = null; 
    }; 
}); 

回避策は、あなたが

Constants.getConstants().then(function(AppContants) { 
    $scope.responseCount = AppContants.data.serverUrl + AppContants.data.appId 
    console.log($scope.responseCount); 
    sampleFunc() 
}); 

function sampleFunc() { 
    // do your oprations here 
    console.log($scope.responseCount); 
} 
+0

はい、これは今私のアプリケーションを実行している方法です。アプリケーション全体で利用可能にする方法があるかどうかを知りたいですか? $ rootScopeやそのようなものに保存するのが好きですか? –

+1

は、ロスコープまたはスコープを使用しても問題ありません。変数に値を代入するのに時間がかかります。 '$ scope.responseCount'が' then'関数の中で割り当てられると、あなたは '$ scope.responseCount'にアクセスしてコントローラから抜けることができます。別のコントローラからアクセスする場合はrootscopeを使用しますが、私の推奨ではそのためのサービスを使用しています。 –

0

あなたがサービスで約束をキャッシュすることができます約束内部の機能を追加し、その関数内であなたの操作を置くことができるですどのコントローラーでも何度でも何度でも何度でも何度でもお使いいただけます:

ConstantCache.getPromise().then(function(AppContants) { 
    $scope.responseCount = AppContants.data.serverUrl + AppContants.data.appId 
    console.log($scope.responseCount); 
    sampleFunc() 
});  
関連する問題