0

関数の外で変数を使用する必要があります。私はすでに古い質問を読みましたが、まだ適切な解決策を見つけることができません.

コードは次のとおりです。

<script>

var warehouseAddress;

$(document).ready(function(){

$.ajax({
    type:"POST",
    url:"${pageContext.request.contextPath}/users/findWarehouseAddress",  
    success:function(data){
        warehouseAddress = data;
    }
}); 

alert(warehouseAddress);

});

var warehouse = warehouseAddress;

</script>

アラートは私に「未定義」を与えます。アラート内だけでなく、ready 関数の外側にある他の「倉庫」値内でもその変数を取得する必要があります。

重複している場合は申し訳ありませんが、私が言ったように、私が読んだ答えではうまくいきませんでした。

編集:完全を期すために、詳細を説明し、アラートを呼び出す必要がある読み取り関数に置き換えます。

コメントで言ったように、私は実際に Google Maps API とその機能を使用しています。$(document).ready外部スクリプトで変数を使用する必要があるため、変数を関数の外に渡す必要があります。

問題は、呼び出さなければならない外部 js 関数がinitialize()、ウィンドウの読み込み時に読み込まれる Google マップ関数 ( ) であるため、$ready 関数の後にその関数を呼び出す方法を見つける必要があることです。

4

3 に答える 3

2

@putvande が既に ajax は非同期であると述べているため、ここで行う最善の方法は、コールバックを利用することです (イベント ベース:D)。

$.ajax({
    type:"POST",
    url:"${pageContext.request.contextPath}/users/findWarehouseLat",  
    success: myDataHandler(data)
}); 

function myDataHandler(data){
    warehouseLat = data;
    //do something with the data here :D as it now exists
    alert(warehouseLat);
}

これを見てください:jqueryのカスタムイベント

于 2013-08-08T08:51:13.563 に答える
1

それが非同期の意味です。

ajax リクエストを完了する前に、warehouseLat.

正常に完了した後に行う必要がありますrequest!!

   $.ajax({
        type:"POST",
        url:"${pageContext.request.contextPath}/users/findWarehouseLat",  
        success:function(data){
            warehouseLat = data;
           alert(warehouseLat);
        }
    }); 
于 2013-08-08T08:45:59.230 に答える
0

@milkshake と他の親切なユーザーのコメントのおかげで、私が見つけた解決策は次のとおりです。

まず、すべての Google マップ スクリプトを外部の .js ファイルに入れます。コードを読みやすくするためにそうする必要がありました。

そのファイルでは、Google Api の addDomListener 関数を使用して必要なものを適切なタイミングでロードし、ajax 呼び出しとメソッド実行の間のタイミング エラーを回避しました。

google.maps.event.addDomListener(window, 'load', function(){

    $.ajax({
        type:"POST",
        url:contextPath+"/products/findWarehouseAddress",  
        success:function(data){
                    warehouseAddress = data;
                    geocoder.geocode({'address': warehouseAddress }, function(results) {
                        warehouse = results[0].geometry.location;
                        initialize();
                    });
        }
    });
});

したがって、タイミングは次のようになります。

  1. Google リスナー;
  2. Ajax 呼び出しは倉庫の住所を返します。
  3. 倉庫の住所を取得したら、それを WarehouseAddress 変数に格納し、ジオコーディングします (住所文字列から座標を抽出します)。
  4. Google マップの初期化関数を呼び出して、変数を使用できるようにします。

できます。しかし、それを行うためのより良い方法があるかもしれないので、より良い解決策があれば、コメントを読んで喜んでいます:)

于 2013-08-09T18:07:11.250 に答える