0

我正在尝试创建一个同时执行两个异步操作的函数。一个是简单的 AJAX 请求,第二个是来自 google maps API 的 getDistanceMatrix。关键是我想要一个使用来自这两个函数的数据的回调函数。我对 JQUERY 函数 $.when() 很熟悉,但我只能在处理两个 AJAX 函数时使用它,而不能使用 google API。这是我试图开始工作的代码。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)
    });
}

我的猜测是谷歌地图 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()函数会返回一个你可以在 中使用的延迟承诺$.when()

于 2012-06-15T20:54:28.267 回答
0

我的猜测是service.getDistanceMatrix调用不会作为调用的结果返回数据,而是调用带有结果的回调函数:

来自https://developers.google.com/maps/documentation/javascript/distancematrix

成功调用距离矩阵服务会返回一个 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 回答