2016-12-11 5 views
-1

私は実行を命じる必要があります。一度呼び出されると、私のCOMPLETE coords()メソッドが終了したことを確認する必要があります。それに約束や$ qを追加する方法は?私はコンソール上で印刷しようとしましたが、coords()関数の最後の行が実行された後にfor each coops in coordsが完了しました。以下のコードを参照してください。私はあなたがfirebaseを使用していて、簡単に変数に格納返された子どもたちを確認することができます

var appa = angular.module('appa',['firebase','uiGmapgoogle-maps']); 
 
appa.controller('mainCtrl', function($firebaseObject,$scope,$q) { 
 

 
       $scope.coords = function(){ 
 
       
 
       var ref = firebase.database().ref(); 
 
       var latArray = []; 
 
       var lngArray = []; 
 
       var cenlat; 
 
       var cenlng; 
 
        var marker = []; 
 
       ref.once("value") 
 
       .then(function(snapshot) 
 
       { 
 
       snapshot.forEach(function(child) 
 
       { 
 

 
        latArray.push(child.child("Lat").val()); 
 
        console.log(child.child("Lat").val()); 
 
        lngArray.push(child.child("Long").val()); 
 
        var mark = { 
 
        id: child.child("Id").val(), 
 
        coords: { 
 
        latitude: child.child("Lat").val(), 
 
        longitude: child.child("Long").val() 
 
        }, 
 
        options: { title: child.child("Alt").val() } 
 
        }; 
 
        marker.push(mark); 
 
CONSOLE.LOG("wWHY IS THIS PRINTED aFTER??? AND HOW TO HANDLE THIS ??"); 
 
       }); 
 

 
        cenlat = (Math.max.apply(Math,latArray)+Math.min.apply(Math,latArray)/2); 
 
        cenlng = (Math.max.apply(Math,lngArray)+Math.min.apply(Math,lngArray)/2); 
 

 
       }); 
 
       $scope.map.center.latitude = cenlat; 
 
       $scope.map.center.longitude = cenlng; 
 
CONSOLE.LOG("wWHY IS THIS PRINTED BEFORE??? AND HOW TO HANDLE THIS ??"); 
 
}); 
 
       }; 
 

 
       $scope.map = { 
 
       center: 
 
       { 
 
        latitude: 51, 
 
        longitude: 4 
 
         }, 
 
       zoom: 2 
 
         }; 
 

 
     $scope.coords(); 
 
     
 

 

 
    });

+1

あなたはスニペットの構文エラーに気付きましたか?あなたが投稿したコードは無効なjavascriptです。あなたは本当にそれを修正して、適切な書式設定をしたコードを投稿する必要があります。あなたのコードは読みにくく、確かにあなたのコードを書く方法は正確です。そして、** CONSOLE.LOG **はとにかく失敗するでしょう。** console.log ** - javascriptはビジュアルベーシックではなく、大文字と小文字が区別されます –

+0

nemoAsad、エビデンスを収集して95%のデバッグを完了しました。間違った順序でログインしているので、コード実行のタイミングを知ることができます。 '$ scope.map'ステートメントが適切なタイミングで実行されるように、コードをシャッフルするだけです。それは複雑ではありません。 –

+0

それが修正されたら、もっともっと.... (1)あなたの平均計算は間違っているようです。 '(max + min/2)'ではなく '(max + min)/ 2'がほしいでしょう。 (2)latとlngの範囲は-180〜+ 180です。 Grenwich経絡にまたがるlatsおよびlngのクラスタであればOKですが、International Date Lineにまたがるlngでは '(max + min)/ 2'は予期しない結果をもたらしますいつかそれが起こるので、 "それは決して起こらないだろう"と言えるくらい十分ではありません。 (3)最大値と最小値の簡単な算術平均は異常値を優先します。代わりに "重心"アルゴリズムを考慮してください。 –

答えて

0

下さい角度の助けには本当に新しいです。 forEachループ内の変数を減らします。

//initialized var a, is having child count 
 
a = snapshot.numChildren();

そして、以下の完全なコードは、実行順序を作成して、約束の基本的な実装を持っています。私は、console.logを追加して注文を表示しています。どのように役立つことを願っています。

//complete code 
 

 
var appa = angular.module('appa',['firebase','uiGmapgoogle-maps']); 
 
appa.controller('mainCtrl', function($firebaseObject,$scope,$q){ 
 

 
       $scope.coords = function(){ 
 
var q = $q.defer(); 
 
       var ref = firebase.database().ref(); 
 
       var latArray = []; 
 
       var lngArray = []; 
 
       var cenlat; 
 
       var cenlng; 
 
       var a="0"; 
 
       var marker = []; 
 

 
       ref.once("value") 
 
       .then(function(snapshot) 
 
       { 
 
       a = snapshot.numChildren(); 
 
       console.log(a); 
 
       snapshot.forEach(function(child) 
 
       { 
 
        latArray.push(child.child("Lat").val()); 
 
        console.log(child.child("Lat").val()); 
 
        lngArray.push(child.child("Long").val()); 
 
        var mark = { 
 
        id: child.child("Id").val(), 
 
        coords: { 
 
        latitude: child.child("Lat").val(), 
 
        longitude: child.child("Long").val() 
 
        }, 
 
        options: { title: child.child("Alt").val() } 
 
        }; 
 
        a= a-1; 
 
        console.log("this is current"+a); 
 
        marker.push(mark); 
 
       }); 
 
console.log("hi"+a); 
 
console.log("going for cenlat"+cenlat); 
 
      cenlat = (Math.max.apply(Math,latArray)+Math.min.apply(Math,latArray)/2); 
 
console.log("done with cenlat"+cenlat); 
 
console.log("going for cenlng"+cenlng); 
 
      cenlng = (Math.max.apply(Math,lngArray)+Math.min.apply(Math,lngArray)/2); 
 
console.log("done with cenlng"+cenlng); 
 
      $scope.map.center.latitude = cenlat; 
 
      $scope.map.center.longitude = cenlng; 
 
      if(a==0){ 
 
      q.resolve('resolved'); 
 
      } 
 
      else{ 
 
      q.reject('rejected'); 
 
      } 
 
       }); 
 

 
       }; 
 
       $scope.map = { 
 
       center: 
 
       { 
 
        latitude: 51, 
 
        longitude: 4 
 
         }, 
 
       zoom: 2 
 
         }; 
 

 
    $scope.coords().then(
 
     function(v){ 
 
console.log(v); 
 
     }, 
 
    function(err){ 
 
console.log(err); 
 
    }); 
 

 
    });

+1

少なくとも、インデントを修正してください! –

+0

私はOPに '$ q'と何か関係があることを知っていますが、それは必要ではありません。私は上記の 'if(a == 0)(...)'ブロックが何かを実証するはずですが、*何*正確に!現在の形では、それは何も実証しておらず、次の電気代に少し追加する以外は何もしません。 –

関連する問題