2016-08-27 10 views
0

私のangular2アプリでは、私はそれに基づいてデバイスの緯度と経度を取得しようとしています。ここでの方法である:Typscript:変数の範囲

getGeoLocation(){ 
     this._http.get(IP_to_GeoLocation_uri).subscribe(res =>{ 
                  this.lat=res.json().lat; 
                  this.lon=res.json().lon; 
                /* console.log("lat: "+this.lat+" long: "+ this.lon); */}); 
    } 

console.log結果がgetGeoLocation()がうまく機能することを示しています。 しかし、このメソッドを別のメソッドで使用しようとすると、this.latthis.lonundefinedになります。 はここに私の方法である:私はそれを期待

getWeatherForcastWithLocation(){ 

     this.getGeoLocation(); 
     console.log("lat: "+this.lat+" long: "+ this.lon); 
     bla..bla..bla... 

    } 

this.getGeoLocation();を呼び出すことによって、それは私のためにlonlatを設定します。しかし、コンソールは彼らがundefinedだと言います。 コードの何が間違っていますか?

+0

'get'が非同期であるため、これらは未定義です。 HTTP応答が受信されるまでは設定されません。 – cartant

+0

応答では、変数ではないオブジェクトを取得します。右? – micronyks

+0

あなたはそれをページに表示したいのですか、それともさらなるコードで使用したいですか? – micronyks

答えて

0

これは非同期呼び出しであるため、すぐにデータをフェッチしません。テンプレートでは

this.getGeoLocation(); 
setTimeout(() => { 
    console.log(this.users) 
}, 3000); 

getGeoLocation()の実行中にエラーを防ぐことができますされ実行された後、データを表示するために*ngIfディレクティブを使用することができ、:コンソールでの印刷が実行されるように、あなたがデータをフェッチした後に、遅延時間を設定することがconsole.log()setTimeout()を使用することができますあなたのコード。例えば、このような何か:

<div *ngIf="lat"> 
    {{lat}} 
</div> 

テンプレートから*ngIfディレクティブを削除した場合、あなたはlatが未定義であるというエラーが発生します。

+0

真実ですが、データを受け取ったらすぐに進めたいと思います。 – Salman

+0

私はいつも考えています、サーバは即座にそれに応答するので、同期が得られます。ではなぜ非同期ですか? – Salman

0

GETは、オブザーバブルを返します。これは、あなたの後に.subscribe()を持っている理由です。 代わりに、あなたが約束し、複数の.thenを追加するには、この観測可能に変換することができ()この約束の後に呼び出されます:

getGeoLocation(){ 
    return this._http.get(IP_to_GeoLocation_uri) 
       .toPromise().then(res =>{ 
        this.lat = res.json().lat; 
        this.lon = res.json().lon; 
        return true; 
       }); 
} 

、その後のように、この約束に「連鎖」アクションを追加します。

オフ
getWeatherForcastWithLocation(){ 
    this.getGeoLocation() 
     .then(res => { 
      console.log(this.lat + " , " + this.lon); 
     }); 
} 

もちろん、これは非同期操作であるため、* ngIf = "lat"、* ngIf = "lon"を対応する限定要素に追加する必要があります。