2

わかりました、このトピックがすでに何度も議論されていることは知っていますが、私の問題を解決するための答えが見つかりません.

だから私は簡単な考えをしようとしています:私は次distance is : " + CalculateDistance(position); のような文字列を作成しています:必要な結果は次のようなものdistance is 5kms (8min)です.

CalculateDistance(position)DistanceMatrix という Google マップ API を呼び出して 2 点間の距離を計算する関数です。API はここに文書化されており、指定されたサンプルは完全に機能します。私はそれを次のように適応させました:

function CalculateDistance(position)
{
    var service = new google.maps.DistanceMatrixService();
    var destination = new google.maps.LatLng(/* some lat/lng */);

    service.getDistanceMatrix(
    {
        origins: [position],
        destinations: [destination],
        travelMode: google.maps.TravelMode.DRIVING,
        unitSystem: google.maps.UnitSystem.METRIC,
        avoidHighways: false,
        avoidTolls: false
    }, callback);
}

function callback(response, status) {
    if (status == google.maps.DistanceMatrixStatus.OK)
    {
        var origins = response.originAddresses;
        var destinations = response.destinationAddresses;

        var results = response.rows[0].elements;
        distanceMatrixResult = results[0].distance.text + " ( " + results[0].duration.text + " min)";
    }

あ、ちなみにdistanceMatrixResultはグローバル変数です。実際には、results[0].distance.text の内容を取得し (コンソールに出力するcallback()と、値は問題ありません)、その値を "Distance is" と連結するだけです。誰かがよりスマートなソリューションを持っている場合は、それを歓迎します!

API 呼び出しは非同期であり、私の場合、distanceMatrixResult結果の文字列は常に空です。しかし、その値をコンソールに記録すると、文字列が作成された後にdistanceMatrixResult値が適切になりました。

私が書きたいのは次のとおりです。

• 呼び出しCalculateDistance(コールバックを非同期で呼び出します)
callbackが終了したら、文字列とdistanceMatrixResult値を連結します。

などのDeferredをいくつか試しましたが、成功$.done()$.when().then()ません...

誰かが私を助けることができますか?
ありがとうございました !

4

1 に答える 1

8

distanceMatrixResultグローバル変数です

Promise (Deferred) が表す値であるべきです。これは基本的なセットアップです:

function calculateDistance(position) {
    var service = new google.maps.DistanceMatrixService();
    var destination = new google.maps.LatLng(/* some lat/lng */);
    var dfd = $.Deferred();
    service.getDistanceMatrix({
        origins: [position],
        destinations: [destination],
        travelMode: google.maps.TravelMode.DRIVING,
        unitSystem: google.maps.UnitSystem.METRIC,
        avoidHighways: false,
        avoidTolls: false
    }, function(response, status) {
        if (status == google.maps.DistanceMatrixStatus.OK)
            dfd.resolve(response);
        else
            dfd.reject(status);
    });
    return dfd.promise();
}

今、あなたがしたいこと

calculateDistance(…).then(function(response) {
    var origins = response.originAddresses;
    var destinations = response.destinationAddresses;
    var results = response.rows[0].elements;
    return results[0].distance.text + " ( " + results[0].duration.text + " min)";
}).done(function(distanceMatrixResult) {
    var myString = "distance is: "+distanceMatrixResult;
    // do something with your string now
});
于 2013-10-01T21:16:37.890 に答える