0

現在、位置オブジェクトの配列をループしています。次に、Google に電話して、その場所のパノラマを取得します。問題は、このリクエストが非同期であることです。そのため、コールバックが実際に呼び出されると、渡した場所変数は配列内の最後の場所になります。

コード例とコンソール ログ出力を次に示します。

  for location in paginated_data.locations
    console.log location
    latLng = new google.maps.LatLng(location.latitude,location.longitude)
    @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
      console.log location          
    )

ここに画像の説明を入力

ご覧のとおり、最初のループではコンソールは正しい場所を認識し、コールバックではループの最後の場所のみを表示します。これを修正する方法について誰かが私を正しい方向に向けることができますか?

4

1 に答える 1

3

アップデート:

キーワードを使用doして、coffeescript にループの繰り返しごとに個別のクロージャーを作成させる必要があります。

  for location in paginated_data.locations
    do (location) ->
      console.log location
      latLng = new google.maps.LatLng(location.latitude,location.longitude)
      @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
        console.log location

ORIGINAL (それほどコーヒースクリプトではありませんが、まだコーヒースクリプトのやり方です):

コードをiifeでラップして、独自のスコープを持ち、次のように渡す必要がありlocationます。

  for location in paginated_data.locations
    ((location) ->
      console.log location
      latLng = new google.maps.LatLng(location.latitude,location.longitude)
      @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
        console.log location          
      )(location)

forまたはループの本体を別のfunction

  getLocation = (location) ->
    console.log location
    latLng = new google.maps.LatLng(location.latitude,location.longitude)
    @sv.getPanoramaByLocation(latLng, 50, (StreetViewPanoramaData, StreetViewStatus) =>
       console.log location

  for location in paginated_data.locations
    getLocation(location)
于 2013-07-12T18:48:39.967 に答える