2016-12-03 9 views
0

IonicフレームワークとFirebaseを使用してJSアプリケーションを構築する。同じ変数を変更する再帰的非同期DB呼び出しを処理する方法

私は、訪問した国に基づいて議論するユーザーのリストを各ユーザーに提案します。現在のユーザーよりも最も一般的な国のユーザーを推奨リストに入れてください。

私はFirebaseで二つのテーブルがあります。上記で説明したように、私は$ scope.matchesがランク付けされたユーザーのリストを保存するフロントエンドで

"country_user" : { 
    "france" : { "userA" : true, "userB" : true, "userC" : true }, 
    "spain" : { "userA" : true, "userC" : true }, 
    "russia" : { "userB" : true } 
} 

"users" : { 
"userA" : { 
    "countries" : [ { 
    "id" : 4, 
    "name" : "france" 
    }, { 
    "id" : 2, 
    "name" : "spain" 
    } ] 
}, 
"userB" : { 
    "countries" : [ { 
    "id" : 4, 
    "name" : "france" 
    }, { 
    "id" : 2, 
    "name" : "russia" 
    } ] 
}, 
"userC" : { 
    "countries" : [ { 
    "id" : 4, 
    "name" : "france" 
    }, { 
    "id" : 2, 
    "name" : "spain" 
    } ] 
} 

とインデックステーブルを。サーバー側では

は、私は次のロジックを実装:

  1. 現在のユーザーが訪れた国のリストを取得し、それぞれの国のために、これらの国々
  2. との約束を返すが、リストcountry_userテーブルで取得しますこの国に
  3. 対応するユーザの「マッチ」配列を作成し、2の各結果を解析し、「マッチ」アレイ

1で約束を更新します。

function getUserCountryListPromise(_uid){ 
     return firebase.database().ref('users/' + user.uid + '/countries/').once('value').then(function(snap){ 
      var userCountryList = []; 
      if(snap.exists()){ 
      snap.forEach(function(country){ 
       userCountryList.push(country.val().name); 
      }); 
      } 
      return userCountryList; 
     }); 
     } 

そして、私は2を実装するために始めたが、私は立ち往生しています:

私は二度、それらの2つのコールが行われます(ただしされている場合のみ、コール数が動的であるgetRegistrationsToCountriesを呼び出したいユーザAの場合に
function getRegistrationsToCountries(_country){ 
     return firebase.database().ref('/country_user/' + _country).once('value').then(function(snap){ 
      if(snap.exists()){ 
      snap.forEach(function(registeredUser){ 


     }); 
     } 

)私はフロントエンドに戻ってほしい "マッチ"リスト​​を更新するためにそれらを解析したい。

提案がありますか?

おかげ

答えて

0

は約束のハッシュに$q.allメソッドを使用します。

function getRegistrationsFromCountryList(countryList){ 
    var promiseHash = {}; 
    countryList.foreach(function (country) { 
     promiseHash[country] = firebase.database().ref('/country_user/' + country).once('value'); 

    }); 
    return $q.all(promiseHash); 
}; 

上記の例ではcountryListでは、それぞれの国にキー登録のハッシュに解決の約束を返します。 countryListPromiseで使用する

、単に約束をチェーン:

var promise = getUserCountryListPromise(uid); 

var registrationsHashPromise = promise.then(function(countryList) { 
    //return promise to chain 
    return getRegistrationsFromCountryList(countryList); 
}); 

registrationsHashPromise.then(function(regsHash) { 
    angular.forEach(regsHash, function(regs, country) { 
     console.log(country + ": " + regs); 
     //update matches list 
    }); 
}); 

約束の.thenメソッドを呼び出すと、新しい派生約束を返すので、約束のチェーンを作成することが容易に可能です。任意の長さのチェーンを作成することは可能であり、約束は別の約束(それ以上解決を延期する)で解決することができるので、チェーンの任意のポイントで約束を一時停止/延期することが可能です。これにより、強力なAPIを実装することが可能になります。

-AngularJS $q Service API Reference -- Chaining Promises

+0

あなたの答えはGeorgeです!私はあなたのソリューションを実装しようとしましたが、$ q(定義されていません)に参照エラーがありますが、正しく挿入すると思います。何か間違っている? –

関連する問題