0

私は OOP の初心者で、ajax リクエストを使用してオブジェクトを構築しようとしています。私が必要としているのは、「responseArray」を JSON 形式で取得し、それに取り組むことです。

function adres(adres) {

this.adres_string = adres;
var self = this
$.ajax({
    type: 'POST',
    url: "http://nominatim.openstreetmap.org/search?q="+adres+"&format=json&polygon=0&addressdetails=0",
    success: function(data) {
        self.responseArray = eval('(' + data + ')')

    }

})


//Method returning point coordinates in EPSG:4326 system
this.getLonLat = function() {

    var lonlat = new OpenLayers.LonLat(this.responseArray.lon, this.responseArray.lat);
    return lonlat;

}
}

アプリケーションコードで私が書いたときに問題が始まります:

var adr = new adres('Zimna 3, Warszawa');
adr.getLonLat();

サーバーから応答を取得する時間がないため、これは何も返しません。どうすれば一番うまく書けるでしょうか?jQuery の when().then() メソッドについて読みました。これは私にとっては問題ないかもしれません。ベストプラクティスを知りたいだけ

4

1 に答える 1

1

これが AJAX の仕組みです ( A同期部分に注目してください)。そうです、あなたが呼び出した瞬間、adr.getLonLat()応答はまだ戻っていません。これは私が提案する設計です: コールバック関数の参照をadresコンストラクターに渡すだけです:

function adres(adres, callbackFun) {
  //...
  success: function(data) {
    var responseArray = eval('(' + data + ')')
    var lonlat = new OpenLayers.LonLat(responseArray[i].lon, responseArray[i].lat);
    callbackFun(lonlat)
}

次のように呼び出します。

adres('Zimna 3, Warszawa', function(lonlat) {
  //...
})

いくつかのコメント:

  • adresは基本的に関数になりました。ここではオブジェクトは必要ありません。

  • evalJSON の解析には使用せず、JSONオブジェクトを使用してください。

  • に POST できますhttp://nominatim.openstreetmap.orgか? 同じオリジンポリシーの問題に遭遇する可能性があります

  • i変数はどこから来るのresponseArray[i]ですか?

于 2012-08-26T17:17:55.887 に答える