2016-11-19 3 views
1

私のアプリケーションのグローバル依存関係を設定するためのこの初期化関数があります.npmパッケージangular-global-resolveを使用しています。パッケージはうまく動作しますが、問題は初期化関数でネストされた約束を持っていて、ネストされたものより先に解決されるという大きな約束があります。つまり、アプリケーションが初めて実行されるときに特定のものが設定されません。これをどうやって解決するのですか?解決の前にプロンプ​​トがネストの約束を待っているのではない

マイコード:
routes.jsで :

globalResolveProvider.addGlobalDependenciesTo($stateProvider, { 
    getGlobalDependacies: function ($http, $rootScope, $cookies) { 
     return $http.get('/__/env.json') 
     .then(function(response) { 
     console.log('then0') 
     $rootScope.apiUrl = response.data.apiUrl; 
     $rootScope.googleMapsApiKey = response.data.googleMapsApiKey; 
     $rootScope.currentLocationLat = 40.7589; 
     $rootScope.currentLocationLng = 73.9851; 
     var hotelId = '' 
     if ($cookies.get('hotel') === undefined){ 
      console.log('if 1') 
      $http.get($rootScope.apiUrl + '/hotels') 
      .then(function(dbHotels){ 
      console.log('then1') 
      hotelId = dbHotels.data[0]._id 
      $cookies.put('hotelId', hotelId) 
      }) 
     } 
     if ($cookies.get('userId') === undefined){ 
      console.log('if 2') 
      $http.get($rootScope.apiUrl + '/users') 
      .then(function(dbUsers){ 
      console.log('then2') 
      var index = dbUsers.data.length - 1 
      var userId = dbUsers.data[index]._id 
      $cookies.put('userId', userId) 
      $rootScope.$broadcast('update-itinerary-icon') 
      }) 
     } 
     }) 
     .then(function(){ 
     console.log("parent then is resolved") 
     }) 
    } 
    }) 

コンソールがログインしている:

then0 
if 1 
if 2 
parent then is resolved 
then1 
then2 

なぜ親は、その後then1then2前に解決していますか?あなたは

$http.get($rootScope.apiUrl + '/hotels') 

それとも行うと

答えて

3

$http.get($rootScope.apiUrl + '/users') 

をこれが唯一の HTTPリクエストを開始します。入れ子になったGETが完了するのを待つことなく、フローは親の約束に従います。そして親はいつものように解決します。

あなたは子の約束のためにを待つ親を作りたい場合は、親が約束返す行う必要があります。あなたは親が複数のを待つようにしたい場合は、今すぐ

return $http.get($rootScope.apiUrl + '/hotels') 

子供の約束、複数の約束を構成する約束を返す必要があります。あなたの関数に$qを注入し、そしてあなたのreturn文としてこれを使用します。

return $q.all(
    $http.get($rootScope.apiUrl + '/hotels'), 
    $http.get($rootScope.apiUrl + '/users') 
); 

あなたが条件ロジックをしたい場合は、あなたがこのような何かを試みることができる:

return $q.all(
    ($cookies.get('hotel') === undefined) 
    ? $http.get($rootScope.apiUrl + '/hotels') 
    : $q.resolve(), 
    ($cookies.get('userId') === undefined) 
    ? $http.get($rootScope.apiUrl + '/users') 
    : $q.resolve() 
); 

をこれは、それがすでにを待ちます仕事が必要ない場合は約束を完了しました。

.then()を上記の例の$http.get()に追加することもできます。

+0

どこに.then?私はこれを試みたが、動作していないようだ:$ q.allを返す($ cookies.get( 'hotel')===未定義)?$ http.get($ rootScope.apiUrl + '/ hotels')。 $ q.resolve() – jmona789

+0

Hm、それは(つまり、(dbHotels){console.log( 'then1')hotelId = dbHotels.data [0] ._ id $ cookies.put( 'hotelId'、hotelId)}) – Birchlabs

+0

あなたは何のエラーもなく、それはまだ順不同で起こっていることです。私は終わりました。とにかく別の方法では、実際には最初のものに2つの約束事を入れ子にする必要はなかったので、最初のものの後に2つのthens()を作成し、 'return $ http.get(..)あなたのお手伝いをありがとう。 – jmona789

関連する問題