1

GeoFire、FireBase、Angular は初めてです。いくつかの座標を取り、それらの座標の近くにいくつかのオブジェクトを返す関数を作成しようとしています。

ビューで使用されるスコープ変数に割り当てる関数からプロミスを返します。プロミスが ready イベントによって解決されたときに、近くにあるオブジェクトの配列が利用可能になることを期待しています。

obj.findGroupsInViscinity = function(pos){
    var gFire = factoryAuth.geoFire;
    var fbaseRef = factoryAuth.usersRef;
    var groupsInQuery = {};
    var groupsInQueryAr = [];
    var deferred = $q.defer();

    var geoQuery = gFire.query({
      center: [pos.coords.latitude, pos.coords.longitude],
      radius: 2
    })

    geoQuery.on("key_entered", function(groupId, groupLocation, distance) {
      console.log("--> key_entered 1");
      groupsInQuery[groupId] = true;

      // Look up the vehicle's data in the Transit Open Data Set
      fbaseRef.child("groups").child(groupId).once("value", function(dataSnapshot) {

        console.log("--> key_entered 2");

        // Get the vehicle data from the Open Data Set
        group = dataSnapshot.val();

        // If the vehicle has not already exited this query in the time it took to look up its data in the Open Data
        // Set, add it to the map
        if (group !== null && groupsInQuery[groupId] === true) {
          console.log("Adding group", group);

          // Add the group to the list of groups in the query
          groupsInQuery[groupId] = group;
          groupsInQueryAr.push({"name": group.name});
        }
      })
    }) // end ke_entered monitoring

    geoQuery.on("ready", function() {
      console.log("GeoQuery ready event received. groupsInQueryAr = ", groupsInQueryAr);

      deferred.resolve(groupsInQueryAr);
      geoQuery.cancel();
      console.log("GeoQuery canceled");
    }) // Cacnel the geoQuery once we have gotten all the groups in viscinity

return deferred.promise; // Return a promise that will be resolved when ready event fires
}  

この関数の呼び出しによるコンソール出力の下に含まれます。 ここに画像の説明を入力

私が気付いたのは、コードの key_entered 部分が 2 回続けて呼び出されていることですが、key_entered イベントを処理するコードが完了する前に、すべての key_entered イベントが発生したため、ready イベントが呼び出されます。そのため、ロジックの key_entered 部分が、promise を解決するために渡したい配列を構築していますが、ready イベントで promise を解決する時点ではまだ準備ができていません。

すべての key_entered イベントが処理され、オブジェクトの配列が適切に構築された後、どのように約束を解決することができますか?

ありがとう、サンジェイ。

4

1 に答える 1

3

これは少しXY の問題だと思います。レストランを取得したら、ビューにロードすることをお勧めします。これにより、ほとんどの場合、ユーザー エクスペリエンスが向上します。

そうは言っても、あなたが求めていることをしたい場合は、$.all()を使用して機能させることができます。基本的に、延期されたプロミスを作成して返します。空のリストから始めて、イベントごとkey_enteredに新しい promise をリストにプッシュします。次に、readyイベント コールバックで、promise のリストに対して a を実行し、それらが ( promise$q.all()の で) 完了したら、 .then()deferred.resolve()

于 2015-12-09T20:26:26.233 に答える