2017-01-25 3 views
0

これを実行すると、変数elevationPointは最初のアラートでは未定義です。私はそれが第2の警告で働くことに事故で気づいた。何故ですか?グローバル変数は、2回使用しない限り、定義されていません。

var elevator = new google.maps.ElevationService(); 
 
var coordinates = new google.maps.LatLng(closestLat , closestLng); 
 
var pointElevation; 
 
elevator.getElevationForLocations({ 
 
    'locations':[coordinates] 
 
    }, function (results, status) { 
 
    if (status == google.maps.ElevationStatus.OK) { 
 

 
     // Retrieve the first result 
 
     if (results[0]) { 
 
      pointElevation = results[0].elevation; 
 
      
 
     } else { 
 
      alert('No results found'); 
 
     } 
 
    } 
 
    else { 
 
     alert('Elevation service failed due to: ' + status); 
 
    } 
 
}); 
 
alert(pointElevation); 
 
alert(pointElevation);

答えて

0

あなたが使用しているAPIにコールバックを渡すということは、それが非同期だと思うようになります。

最初のアラートを作成すると、非同期タスクはまだ完了していません。 2番目のアラートが発生するまでにコールバックが完了し、youbexoexという変数に期待値が得られます。 APIに渡す関数の内部でアラートを移動してみてください。うまくいくはずです。

よろしく

編集コールバックを必要と

機能は、通常は非同期である、と彼らはイベントループと呼ばれる別のスレッドで実行し、ブロッキング/ノンブロッキング・トピックを明快にします。コードは評価の直後に実行されるため、APIコールはすぐに起動され、イベントループに配置されます。最初のアラートに到達すると、非同期操作はすでにeventLoopにあります。したがって、アラートはブロックされていますが、別のスレッドで実行されているコードをブロックすることはできません。 2番目のアラートが実行されると、非同期コードはすでに完了しており、コールバックが実行されているため、2番目のアラートの値を見ることができます。

は、私はあなたがイベントループについて検討をお勧めしますと、それは をどのように動作するかこれは素晴らしい視覚的な説明

+0

https://m.youtube.com/watch?v=8aGhZQkoFbQはどのように任意のコールバックの実行ができます。アラートがブロックされている間はアラートが実行されている間は実行できません。また、第1アラートと第2アラートの間で実行されることはありません。スクリプトブロック全体が実行されるまで、イベントは実行できません。 – Blindman67

+0

@ Blindman67 Danielo515によると、APIは非同期呼び出しなので、ブロックされていません。コールバックを渡しても非同期コールは保証されませんが、ほとんどの非同期コールはコールバックメカニズムを使用します。 –

+0

@DJ非同期関数が呼ばれていますか? https://tc39.github.io/ecma262/#sec-async-function-definitions私はコード実行を中断させ、実行中の状態を変更できるようにする方法は知らない。私はその可能性のために高低を検索しました。あなたがそれをやる方法をどこで知ることができるかを指摘できますか?さらなる調査については – Blindman67

0

pointElevationは、非同期呼び出しgetElevationForLocations()内で定義されているので。偶然、第2のアラートはそれまでに非同期コールが終了したため動作しますが、保証されていません。

関連する問題