0

2 つの非同期アクションを同時に実行する関数を作成しようとしています。1 つは単純な AJAX リクエストで、2 つ目は Google マップ API からの getDistanceMatrix 用です。ポイントは、両方の関数からのデータを使用する単一のコールバック関数が必要だということです。私は JQUERY 関数 $.when() に精通していますが、Google API ではなく、2 つの AJAX 関数を扱う場合にしか使用できませんでした。これは、私が仕事をしようとしているコードです。a1 は問題ありませんが、a2 は定義されていません。

function getLocation(){
    var service = new google.maps.DistanceMatrixService()
    var origin = new google.maps.LatLng(32.07989,34.813026);
    var destination = new google.maps.LatLng(32.08989,34.813026);
    return  service.getDistanceMatrix({
        origins: [origin],
        destinations: [destination],
        travelMode: google.maps.TravelMode.WALKING ,
        unitSystem: google.maps.UnitSystem.METRIC,
        avoidHighways: false,
        avoidTolls: false
    })
}
function getFriends(){
    return $.ajax({
        data: "&action=get_friends"
    });
$.when( getLocation(),getFriends()).done(function(a2,a1){
        alert(a1)
        alert(a2)
    });
}

私の推測では、Google マップ API は値を返さないだけですが、複雑なパターンを含まないソリューションを見つけたいと考えています。
時間をありがとう、
ダニエル

4

2 に答える 2

1

コールバック用に独自の$.Deferredインスタンスを作成できます。service.getDistanceMatrix()

function getLocation(){
    var deferred = new $.Deferred();
    var service = new google.maps.DistanceMatrixService()
    var origin = new google.maps.LatLng(32.07989,34.813026);
    var destination = new google.maps.LatLng(32.08989,34.813026);
    service.getDistanceMatrix({
        origins: [origin],
        destinations: [destination],
        travelMode: google.maps.TravelMode.WALKING ,
        unitSystem: google.maps.UnitSystem.METRIC,
        avoidHighways: false,
        avoidTolls: false
    }, function(response, status) {
        if (status == google.maps.DistanceMatrixStatus.OK) {
          deferred.resolve(response);
        } else {
          deferred.reject(status);
        }
    })
    return deferred.promise();
}

このgetLocation()関数は、で使用できる遅延promiseを返します$.when()

于 2012-06-15T20:54:28.267 に答える
0

私の推測では、service.getDistanceMatrix呼び出しは呼び出しの結果としてデータを返さず、代わりに結果を使用してコールバック関数を呼び出します。

https://developers.google.com/maps/documentation/javascript/distancematrixから:

Distance Matrixサービスが正常に呼び出されると、DistanceMatrixResponseオブジェクトとDistanceMatrixStatusオブジェクトが返されます。これらは、リクエストで指定したコールバック関数に渡されます。

おそらく、応答オブジェクトを遅延に返すコールバックを提供する必要があります。

function getLocation(){
    var service = new google.maps.DistanceMatrixService()
    var origin = new google.maps.LatLng(32.07989,34.813026);
    var destination = new google.maps.LatLng(32.08989,34.813026);
    return  service.getDistanceMatrix({
        origins: [origin],
        destinations: [destination],
        travelMode: google.maps.TravelMode.WALKING ,
        unitSystem: google.maps.UnitSystem.METRIC,
        avoidHighways: false,
        avoidTolls: false
    }, myCallback) // add callback here
}
function getFriends(){
    return $.ajax({
        data: "&action=get_friends"
    });
$.when( getLocation(),getFriends()).done(function(a2,a1){
        alert(a1)
        alert(a2)
    });
}
// declare the callback function
function myCallback(response, status) {
  if (status == google.maps.DistanceMatrixStatus.OK) {
    return response;
  } else {
    return false;
  }
}
于 2012-06-15T20:48:29.843 に答える