まず最初に、これと似たような質問をたくさん知っているので、申し訳ありません。私はそれらの多くを読みましたが、答えを得ることができませんでした );
GoogleマップでWebアプリを構築しています。
非同期 geocode() 関数が終了するのを待つために、javascript で一種の「待機」または「スリープ」関数を使用したかったのですが、
しかし、しばらくグーグルで調べたところ、javascriptにはそれらのいずれも含まれていないことがわかりました。そのためにはjQuery deferredを使用する必要があります。
(私はjQuery 1.8.3を使用しており、Google Chromeブラウザでテストしています)
だから私はこのようにコードを書きましたが、うまくいきません。
Location.prototype.geocode = function() {
deferred = new $.Deferred();
var latLng = this.latLng;
var point = null;
geocoder.geocode( {'latLng': latLng},
function(results, status) {
var point = null;
if (status == google.maps.GeocoderStatus.OK) {
if (results[0]) {
alert(results[0].formatted_address); // alert in callback
point = get_something_blah_blah_function() /* set return value here */
deferred.resolve();
} else {
deferred.reject();
alert('Geocder Error: no result');
}
} else {
deferred.reject();
alert('Geocoder Error: ' + status);
}
}
);
alert(deferred.state()); // alert 1
deferred.then(alert(point)); // alert 2
alert(deferred.state()); // alert 3
return point; /* return value is set in geocode callback function */
}
この順番で警告メッセージが表示されると思っていましたが、
- 'pending' (アラート 1) -> 2. ポイントのアドレス (コールバックのアラート) -> 3. '[object Object]' (アラート 2) -> 4. '解決済み' (アラート 3) 私のコードは解決されるまで据え置きで待機し、
しかし、私が見たのは 1.「保留中」(アラート 1) -> 2.「ヌル」(アラート 2) -> 3.「保留中」(アラート 3) -> アドレス (コールバックのアラート)
解決または拒否されるまで待たなかったのはなぜですか?
then() の代わりに done() と always() で試してみましたが、すべて失敗しました。
この問題は私を一週間ブロックしています...
前もって感謝します!