2

まず最初に、これと似たような質問をたくさん知っているので、申し訳ありません。私はそれらの多くを読みましたが、答えを得ることができませんでした );

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 */
}

この順番で警告メッセージが表示されると思っていましたが、

  1. 'pending' (アラート 1) -> 2. ポイントのアドレス (コールバックのアラート) -> 3. '[object Object]' (アラート 2) -> 4. '解決済み' (アラート 3) 私のコードは解決されるまで据え置きで待機し、

しかし、私が見たのは 1.「保留中」(アラート 1) -> 2.「ヌル」(アラート 2) -> 3.「保留中」(アラート 3) -> アドレス (コールバックのアラート)

解決または拒否されるまで待たなかったのはなぜですか?

then() の代わりに done() と always() で試してみましたが、すべて失敗しました。

この問題は私を一週間ブロックしています...

前もって感謝します!

4

1 に答える 1

2

deferrds の操作方法を完全には認識していないようです。

sのドキュメントの例を見てくださいpromise。deferrds では、実際の値を返すことはありませんが、deferrd を使用してそれを返します。

したがって、 を返す代わりに、pointを返す必要がありますdeferred.promise()。次に$.when()、deferrd が成功または失敗したときに、コールバックを実行するために使用できます。成功または失敗の値にアクセスするには、目的のパラメーターを適切な関数に渡す必要があります。deferrd を解決または拒否し、値を使用して実行しますdeferred.resolve(point)

したがって、ポイントにアクセスするためにこのようなことを行うことができます(geocode()を返すものに置き換えますpromise()

$.when(geocode()).then(function(point){
  console.log(point);
}, function() {
  console.log("the deferred got rejected");
});
于 2013-02-28T13:29:20.310 に答える